8

我正在编写通用的 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
}

我在 $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

而正确的执行路径应该是:

D:\some path\Command.exe -package:"package - three - external" -action:doit

包装周围没有引号 - 一 - 外部搞砸了一切

如何解决这个问题,因为我已经测试了许多解决方案,但没有一个有效。

提前感谢您的帮助!

4

5 回答 5

8

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

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

因此,要修复您的脚本,请尝试将您的deploymentpackages数组替换为:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')
于 2013-02-20T21:21:35.700 回答
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
}

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

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

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

& $deployCmd "-package:`"$deployPackage`"" -action:doit
于 2013-02-20T20:54:02.603 回答
2

尝试在带有双引号的字符串周围使用单引号。我稍微简化了脚本,只写字符串而不是运行它。

$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;
}
于 2013-02-20T21:19:57.950 回答
1

尝试从 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%

但有点棘手,因为您必须在每条消息的开头和结尾添加 \" 。

在所有情况下,我的消息标题都正确显示,消息开头和结尾没有双引号 :-)

于 2018-05-18T10:07:58.693 回答
1

使用""". 例如,

$Var = "One"

$Var将显示One.

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

于 2015-12-07T16:08:26.937 回答