【问题标题】:Parameters with double quotes are not properly passed to Scriptblock by ArgumentList带双引号的参数未通过 ArgumentList 正确传递给 Scriptblock
【发布时间】:2013-02-20 20:15:21
【问题描述】:

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

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: powershell powershell-remoting


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做

      $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> 捆绑到一个参数中,然后传递给您的可执行文件,这与在cmd.exe 中执行-package:"aaa bbb ccc" 之类的操作相同。

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

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

      & $deployCmd "-package:`"$deployPackage`"" -action:doit
      

      【讨论】:

        【解决方案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;
        }
        

        【讨论】:

          【解决方案4】:

          使用"""。例如,

          $Var = "One"
          

          $Var 将显示One

          """$Var""" 将显示One

          【讨论】:

            【解决方案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%
            

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

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

            【讨论】:

              猜你喜欢
              • 2015-11-21
              • 2017-10-31
              • 1970-01-01
              • 2015-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-16
              • 2022-01-25
              相关资源
              最近更新 更多