【问题标题】:Variable passing with escape character in ScriptBlock在 ScriptBlock 中使用转义字符传递变量
【发布时间】:2013-11-07 20:13:49
【问题描述】:

我正在使用 PowerShell 会话来运行一些命令,并希望按原样传递参数,包括像 " 这样的引号。我传递的命令不包含引号,这里是代码:

$myarg= "run"
$CArg = "XXX"    ## CArg should be passed as "XXX"

Invoke-Command -Session $session  -Scriptblock { param($myarg,$CArg) &'C:\program.exe'  $myarg  -CArg $CArg -ArgumentList $myarg,$CArg

我也尝试了@ArgumentList 并遇到了同样的问题

【问题讨论】:

    标签: powershell escaping parameter-passing


    【解决方案1】:
    $CArg = "`"XXX`""
    $string = "&'C:\program.exe' $myarg -CArg" +  "$CArg"
    $scriptblock = [scriptblock]::create($string)
    Invoke-Command -Session $session -Scriptblock $scriptblock
    

    【讨论】:

      【解决方案2】:

      如果您希望接收 EXE 获取带有引号的参数,您必须稍微努力以克服去除引号的各个阶段。试试这个:

      120> $carg = "`"`"`"foo`"`"`""
      121> Invoke-Command { param($myarg,$CArg) echoargs $myarg -CArg $CArg } -ArgumentList myarg,$CArg
      
      Arg 0 is <run>
      Arg 1 is <-CArg>
      Arg 2 is <"foo">
      
      Command line:
      "C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\Pscx\Apps\EchoArgs.exe"  run -CArg """foo"""
      

      请注意,echoargs 是来自 PSCX 的实用程序,可帮助调试传递给本机 exe 的参数。

      【讨论】:

        【解决方案3】:

        对于这样的问题,我通常会使用 [scriptblock]::create() 和一个可扩展的 here-string:

        $myarg= "run"
        $CArg = "XXX"    ## CArg should be passed as "XXX"
        
        $scriptblock = [scriptblock]::create(@"
        &'C:\program.exe'  $myarg  -CArg "$CArg"
        "@)
        
         Invoke-Command -Session $session  -Scriptblock $scriptblock
        

        here 字符串可让您将任何类型的引号放在您想要的任何位置。

        【讨论】:

        • 你能澄清一下吗?
        • 我在下面添加了我的解决方案,由于某种原因,powershell 不喜欢脚本开头的@,我曾经在 C# 中这样做以转义 \ 字符。在 C# 中: File.Open(@"C:\program.exe") // 这相当于: File.Open("C:\\program.exe") // 这些对于 powershell 是相同的,这不起作用...
        • 我不确定你所说的“@ 在 PS 中是不可接受的”是什么意思,但我怀疑你们很多人没有正确格式化这里的字符串。在 here-string 中,开头的 @" 可以在该行的任何位置,但结尾的 "@ 必须从位置 1 开始。
        【解决方案4】:

        我不确定您想要实现什么,但如果您将参数传递为“”“XXX”“”

        PS C:\Users\demo.b> """XXXX"""
        "XXXX"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-12-27
          相关资源
          最近更新 更多