Параметры сценария MSDEPLOY powershell не работают - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь развернуть сайт (в основном файл zip) с моей машины на удаленную машину. Я тестировал то же самое до того, как реализовал фактическое удаленное развертывание, и работал над кодом командной строки msdeploy с использованием powershell.

Позже я настрою этот код на языке C# и выполню его, чтобы автоматизировать развертывание.

Прямо сейчас я сталкиваюсь с ошибкой, которая называется

$msdeploy = "C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe"
            $package = "C:\Deploy\Test\Test.zip"
            $compname = "test_vm02"
            $appname = "Default Web Site/Test"
            $appvalue = "Test\"
            $md = $("`"{0}`" -verb:sync -source:package=`"{1}`" -dest=auto,ComputerName=`"{2}`" -setParam=name=`"{3}`",value=`"{4}`" -allowUntrusted" -f $msdeploy, $package, $compname, $appname, $appvalue)
        cmd.exe /C $md

. Это дает ошибку, говоря, что источник не поддерживает параметр 'Default Web Site/Test'. Must be one of ()

Я также заменил веб-сайт по умолчанию на IIS Web Application Name, который в этом случае также не работал, и выдал ту же ошибку.

Любая помощь очень ценится !!

1 Ответ

1 голос
/ 20 января 2020

Обработка кавычек в аргументах, передаваемых внешним программам, в 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"

...