在ScriptBlock中使用转义字符传递变量

时间:2013-10-28 21:18:40

标签: powershell escaping parameter-passing

我正在使用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并遇到了同样的问题

4 个答案:

答案 0 :(得分:1)

对于这样的问题,我通常会回到使用[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

使用此字符串,您可以根据需要添加所需的任何引号。

答案 1 :(得分:1)

如果您希望接收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中的一个实用程序,它可以帮助调试参数传递给本地exes。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

$CArg = "`"XXX`""
$string = "&'C:\program.exe' $myarg -CArg" +  "$CArg"
$scriptblock = [scriptblock]::create($string)
Invoke-Command -Session $session -Scriptblock $scriptblock
相关问题