【问题标题】:Split string into separate strings in PowerShell在 PowerShell 中将字符串拆分为单独的字符串
【发布时间】:2020-02-24 19:48:56
【问题描述】:

我在 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 但它没有按我的预期工作

【问题讨论】:

  • 仅供参考,dbo.sysdatabases 已被弃用多年(也许自 SQ​​L Server 2000 以来,我真的不记得了?)。你真的应该使用sys.databases
  • 谢谢您的信息。

标签: sql-server powershell


【解决方案1】:

注意:任何时候您将参数直接放入 SQL 字符串中,您都可能面临恶意编码器和 SQL 注入问题。建议在 SQL 字符串中使用输入之前对输入进行清理(确保输入有效)。 Exploits of a Mom

通过将字符串数组放入字符串中而不进行预处理,您将得到您所要求的内容。一个简单的方法是先在数组成员之间填充东西,所以像这样添加', '-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

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2014-03-08
    • 2016-02-21
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多