用双引号参数不正确的参数列表传递给脚本块(Parameters with double quotes

2019-08-17 02:37发布

我写的通用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

如何超限这个问题,因为我已经测试解决方案的数量和非他们一起工作。

感谢您提前帮助!

Answer 1:

你可以做这样的事情

$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


Answer 2:

您可以使用单引号来包装你的字符串解决这个问题。 单引号,引号之间的内容不会被改动(变量不会扩大和喜欢的报价标志将被保留)。 例如

PS > '"this is a test"'
"this is a test"

因此,要解决你的脚本,请尝试更换您的deploymentpackages与此阵:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')


Answer 3:

尝试使用带双引号的字符串周围单引号。 我简单的脚本一点点地只写字符串,而不是运行它。

$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;
}


Answer 4:

使用""" 。例如,

$Var = "One"

$Var将显示One

虽然"""$Var"""会显示One



Answer 5:

试图从从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