Параметры с двойными кавычками неправильно передаются в 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