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.exe
和 msdeploy.exe
等程序也应该 识别这种引用风格,但遗憾的是它们不识别。
我正在尝试将站点(基本上是一个 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 破坏(重新)引用传递给外部程序的参数(参见
如果您刚刚使用 -source:package=$package
并且 $package
的值包含嵌入的空格,PowerShell 将在幕后双引号 whole 令牌并传递像
"-source:package=C:\Deploy 1\Test\Test.zip"
msiexec.exe
和 msdeploy.exe
等程序也应该 识别这种引用风格,但遗憾的是它们不识别。