我写的通用PowerShell脚本到远程计算机上进行部署。 我已经打一个问题,我不能溢出,而这个问题是通过参数列表传递脚本块双引号参数
我有这样的事情:
$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
}
我在$ deploymentPackages加双引号。 而我依然让我的命令remotly执行这样的(这当然是失败):
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
而正确的执行路径应该是:
D:\some path\Command.exe -package:"package - three - external" -action:doit
周围没有包报价 - 一个 - 外部其陷入困境everythig
如何超限这个问题,因为我已经测试解决方案的数量和非他们一起工作。
感谢您提前帮助!
你可以做这样的事情
$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
}
这种捆绑-package:<some string here>
传递给你的可执行文件,这是一样的做这样的事情,当进入一个参数-package:"aaa bbb ccc"
输入cmd.exe。
我想你不希望传递给EXE文字的报价,只为-package:<some string here>
是一个参数,无论在空间<some string here>
如果你想文字引号传递exe文件,请使用上面的代码
& $deployCmd "-package:`"$deployPackage`"" -action:doit
您可以使用单引号来包装你的字符串解决这个问题。 单引号,引号之间的内容不会被改动(变量不会扩大和喜欢的报价标志将被保留)。 例如
PS > '"this is a test"'
"this is a test"
因此,要解决你的脚本,请尝试更换您的deploymentpackages
与此阵:
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')
尝试使用带双引号的字符串周围单引号。 我简单的脚本一点点地只写字符串,而不是运行它。
$remoteAddress = "some-pc";
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"');
foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock {
param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage);
} -ArgumentList $deploymentPackage;
}
试图从从DOS脚本调用PowerShell脚本发送电子邮件时,我也遇到了同样的问题。 我已经失去了一些时间来找到以下解决方案。
DOS脚本
set MSG="US-TrackingFile has been copied to Z: drive"
call SendMail.bat %MSG%
SendMail.bat DOS脚本
PowerShell.exe .\SendMail.ps1 '"%1"'
SendMail.ps1 PowerShell脚本
$msg = $args[0]
Send-MailMessage
-to "bernard_schleich@atos.net"
-subject "$msg"
-smtpserver emearelay.ec.company.com
-from "windows.system@company.com"
无需调用中介DOS脚本工作也以下解决方案
set MSG="\"US-TrackingFile has been copied to Z: drive\""
PowerShell.exe .\SendMail.ps1 %MSG%
但有点棘手,因为你必须在开始和每封邮件的末尾添加\”。
在任何情况下,我的消息的标题,而不在启动和消息的结束双引号正确显示:-)
文章来源: Parameters with double quotes are not properly passed to Scriptblock by ArgumentList