带有双引号的参数未通过ArgumentList正确传递给Scriptblock

Mid*_*idi 5 powershell powershell-remoting

我正在编写通用的PowerShell脚本来在远程计算机上执行部署.我遇到了一个我无法超越的问题,这个问题是ArgumentList传递的Scriptblock中带双引号的参数

我有这样的事情:

$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`")

foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) &  $deployCmd -package:$deployPackage -action:doit } -ArgumentList   $deploymentCommand,$deploymentPackage
}
Run Code Online (Sandbox Code Playgroud)

我在$ deploymentPackages中添加了双引号.而且我仍然像我一样快速执行我的命令(当然失败了):

D:\some path\Command.exe -package:package - one - external -action:doit
D:\some path\Command.exe -package:package - two - external -action:doit
D:\some path\Command.exe -package:package - three - external -action:doit
Run Code Online (Sandbox Code Playgroud)

适当的执行路径应该是:

D:\some path\Command.exe -package:"package - three - external" -action:doit
Run Code Online (Sandbox Code Playgroud)

包裹周围没有引号 - 一个 - 外部的东西搞乱了每一个

如何超越这个问题,因为我已经测试了多个解决方案,而且没有测试过.

提前感谢您的帮助!

Fro*_* F. 8

您可以使用单引号来包装字符串来解决此问题.使用单引号时,引号之间的内容将保持不变(变量不会扩展,并且将保留引号之类的符号).例如

PS > '"this is a test"'
"this is a test"
Run Code Online (Sandbox Code Playgroud)

所以要修复你的脚本,尝试用deploymentpackages这个替换你的数组:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')
Run Code Online (Sandbox Code Playgroud)


lat*_*kin 6

你可以这样做

$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal')
$remoteScript = {
    param( $deployCmd, $deployPackage )
    & $deployCmd "-package:$deployPackage" -action:doit
}

foreach ($deploymentPackage in $deploymentPackages)
{
   invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage
}
Run Code Online (Sandbox Code Playgroud)

-package:<some string here>当传递给您的可执行文件时,它会捆绑成一个参数,这与执行-package:"aaa bbb ccc"cmd.exe中的操作相同.

我假设您不希望将文字引号传递给exe,只是为了-package:<some string here>成为单个参数而不管其中的空格<some string here>

如果您希望将文字引号传递给exe,请使用上面的代码

& $deployCmd "-package:`"$deployPackage`"" -action:doit
Run Code Online (Sandbox Code Playgroud)