MSDEPLOY powershell 脚本参数不起作用

MSDEPLOY powershell script parameters does not work

我正在尝试将站点(基本上是一个 zip 文件)从我的机器部署到远程机器。在我实施实际的远程部署之前,我正在测试相同的内容,并且我正在使用 powershell 处理 msdeploy 命令行代码。

稍后我将使用 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,在这种情况下也无法正常工作并抛出相同的错误。

非常感谢任何帮助!!

PowerShell 对传递给外部程序的参数中的引号的处理是 ,但是如果涉及到另一个级别的引号,事情就会变得更加复杂,例如在您的 间接 通过 cmd.exe.

调用 msdeploy.exe

通常没有理由通过cmd /c调用外部程序;相反,直接从 PowerShell 调用它们 ,如果程序名称是 quoted 或通过 给出变量,需要在命令行前加上&call operator:

注:行尾 ` 个字符。是续行,仅用于可读性;忽略损坏的语法突出显示。

$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 选项之前 `-转义 -,这是 [=32= 中描述的错误的解决方法].

保留参数名称(例如 -source:package),否则不加引号并将它们的参数括在显式的嵌入式引号中(`")确保整个令牌通过看起来像 -source:package="C:\Deploy\Test\Test.zip",一些程序,特别是 msiexec.exe,可能还有 msdeploy.exe,需要。

警告:如果 PowerShell 破坏(重新)引用传递给外部程序的参数(参见 ) should ever get fixed (see this GitHub issue),此技术将 破坏.

如果您刚刚使用 -source:package=$package 并且 $package 的值包含嵌入的空格,PowerShell 将在幕后双引号 whole 令牌并传递像
"-source:package=C:\Deploy 1\Test\Test.zip"

msiexec.exemsdeploy.exe 等程序也应该 识别这种引用风格,但遗憾的是它们不识别。