我正在尝试将站点(基本上是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对传递给外部程序的参数中引号的处理是fundamentally broken,但是如果涉及另一个引号级别,情况会变得更加复杂,例如通过[C0对msdeploy.exe
的indirect调用]。
通常没有理由通过cmd.exe
调用外部程序;而是将其命名为直接从PowerShell,如果程序名称为quoted或通过variable给出,则需要在命令行前面加上cmd /c
,[ C0]:
注意:行尾&
字符。是连续行,仅用于可读性;忽略损坏的语法突出显示。
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
),否则不加引号,并将其参数括在显式的嵌入式引号(this GitHub issue)中,以确保整个令牌通过类似-source:package
的外观传递,某些程序尤其是`"
],也可能需要-source:package="C:\Deploy\Test\Test.zip"
。如果仅使用msiexec
,并且msdeploy.exe
的值包含嵌入式空格,那么PowerShell将在幕后将whole标记双引号,并传递类似-source:package=$package