Параметры с двойными кавычками неправильно передаются в Scriptblock by ArgumentList

Я пишу generic powershell script для развертывания на удаленных компьютерах. Я столкнулся с одной проблемой, которую я не могу перехватить, и эта проблема связана с параметрами с двойными кавычками в Scriptblock, переданными ArgumentList

У меня есть что-то вроде этого:

$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @(`""package - one - external"`", `""package - two - external"`", `""package - three - internal"`")

foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) &  $deployCmd -package:$deployPackage -action:doit } -ArgumentList   $deploymentCommand,$deploymentPackage
}

Я добавил двойные кавычки в $deploymentPackages. И все же я получаю мою команду, выполненную удаленно, как это (что, конечно же, не удается):

D:\some path\Command.exe -package:package - one - external -action:doit
D:\some path\Command.exe -package:package - two - external -action:doit
D:\some path\Command.exe -package:package - three - external -action:doit

тогда как правильный путь выполнения должен быть:

D:\some path\Command.exe -package:"package - three - external" -action:doit

без кавычек вокруг пакета - один - внешний, который испортил everythig

Как перехватить эту проблему, потому что я тестировал количество решений и не работал.

Спасибо за помощь заранее!

Ответ 1

Вы можете сделать что-то вроде этого

$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal')
$remoteScript = {
    param( $deployCmd, $deployPackage )
    & $deployCmd "-package:$deployPackage" -action:doit
}

foreach ($deploymentPackage in $deploymentPackages)
{
   invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage
}

Это связывает -package:<some string here> в один аргумент при передаче в ваш исполняемый файл, что аналогично тому, как делать -package:"aaa bbb ccc" в cmd.exe.

Я предполагаю, что вам не нужны литеральные кавычки, переданные в exe, только для -package:<some string here> для одного аргумента независимо от пробелов в <some string here>

Если вы хотите, чтобы литеральные кавычки передавались в exe, используйте приведенный выше код с помощью

& $deployCmd "-package:`"$deployPackage`"" -action:doit

Ответ 2

Вы можете исправить это, используя одиночные кавычки, чтобы обернуть ваши строки. При одинарных кавычках содержание между кавычками будет не затронуто (переменные не будут расширяться, а знаки, как и кавычки, будут сохранены). Например.

PS > '"this is a test"'
"this is a test"

Итак, чтобы исправить ваш script, попробуйте заменить массив deploymentpackages следующим:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')

Ответ 3

Попробуйте использовать одинарные кавычки вокруг строки с двойными кавычками. Я упростил script немного, чтобы просто написать строку, а не запускать ее.

$remoteAddress = "some-pc";
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"');

foreach ($deploymentPackage in $deploymentPackages)
{
    invoke-command -ComputerName $remoteAddress -ScriptBlock {
        param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage); 
    } -ArgumentList   $deploymentPackage;
}

Ответ 4

Используйте """. Например,

$Var = "One"

$Var отобразит One.

Пока """$Var""" отобразит One