在PowerShell中将字符串拆分为单独的字符串

5

我的PowerShell脚本运行:test.ps1 -dbo test1 => 这有效,它进入了提供的数据库。

SELECT name FROM sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb', 'test1');

但是如果我想要进入多个数据库,例如:test.ps1 -dbo test1, test2, test3 => 这被视为一个字符串。

SELECT name FROM sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb', 'test1, test2, test3');

我该如何在Powershell中将字符串拆分为单独的部分,就像这样:

SELECT name FROM sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb', 'test1', 'test2', 'test3');

代码:

Param(
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
    [Alias("dbo")]
    [String[]]
    $databaseName
)

$dbquery = @"
        SELECT name FROM sys.databases
        where name not in ('master', 'tempdb', 'model', 'msdb', '$databaseName');
"@
Invoke-Sqlcmd -ServerInstance "$databaseIP" -Database "master" -Username $databaseUser -Password $databasePass -Query $dbquery

我尝试使用 splitjoin,但它并没有像我预期的那样工作。


1
FYI,dbo.sysdatabases 已经被弃用多年了(可能自 SQL Server 2000 开始,我真的记不清了?)。你应该使用 sys.databases - Thom A
谢谢您提供的信息。 - Solaire
1个回答

3
注意:任何时候,如果你将参数直接放入 SQL 字符串中,就可能会招致恶意程序员和 SQL 注入问题。建议在使用 SQL 字符串之前对输入进行清理(确保输入是有效的)。妈妈的漏洞利用 通过将字符串数组放入未经预处理的字符串中,你实际上得到了你所要求的内容。一种简单的方法是首先在数组成员之间填充内容,然后使用 -join 添加', ', 如此操作(根据 @CaiusJard 的建议添加数组名的复数形式):
Param(
    [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
    [Alias("dbo")]
    [String[]]
    $databaseNames
)

$databaseNameString = $databaseNames -join "', '"
$dbquery = @"
        SELECT name FROM master.dbo.sysdatabases
        where name not in ('master', 'tempdb', 'model', 'msdb', '$databaseNameString');
"@
Invoke-Sqlcmd -ServerInstance "$databaseIP" -Database "master" -Username $databaseUser -Password $databasePass -Query $dbquery

我希望这能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接