Обработка кавычек в аргументах, передаваемых внешним программам, в PowerShell принципиально нарушена , но все усложняется, если используется другой уровень цитирования, как в случае косвенного вызов msdeploy.exe
через cmd.exe
.
Обычно нет причин вызывать внешние программы через cmd /c
; вместо этого вызывайте их непосредственно из PowerShell , который, если имя программы заключено в кавычки или задано с помощью переменной , требует добавления в командной строке &
, оператор вызова :
Примечание: конец строки `
символов. являются продолжениями строки, используемыми только для удобства чтения; игнорируйте неправильную подсветку синтаксиса.
$package = 'C:\Deploy\Test\Test.zip'
$compname = 'test_vm02'
$appname = 'Default Web Site/Test'
# !! If a value ends in '\' you must *double* the '\' if the value
# !! ends up just before a " in the ultimate command line.
$appvalue = 'Test\\'
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
-verb:sync `
-source:package=`"$package`" `
`-dest=auto,ComputerName=`"$compname`" `
`-setParam=name=`"$appname`",value=`"$appValue`" `
-allowUntrusted
Обратите внимание на необходимость `
- экранировать -
перед параметрами -dest
и -setParam
, что является обходным путем для описанной ошибки в этой проблеме GitHub .
Если оставить имена параметров (например, -source:package
) без кавычек и заключить их аргументы в явные встроенные кавычки (`"
), то будет пройден весь токен просматривая что-то вроде -source:package="C:\Deploy\Test\Test.zip"
, что требуется для некоторых программ, особенно msiexec
и, возможно, также msdeploy.exe
.
Если вы только что использовали -source:package=$package
, а значение $package
содержало встроенные пробелы, PowerShell дважды процитируйте целом токен за кулисами и передайте что-то вроде
"-source:package=C:\Deploy 1\Test\Test.zip"