Разделить строку на отдельные строки в PowerShell - PullRequest
4 голосов
/ 24 февраля 2020

Мой скрипт в 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

Я пытался с split и присоединиться , но это не работает, как я ожидал

1 Ответ

1 голос
/ 24 февраля 2020

ПРИМЕЧАНИЕ. Каждый раз, когда вы берете параметры и непосредственно помещаете их в строку 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

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...