Powershell 在ScriptBlock中使用转义字符传递变量
我正在使用PowerShell会话运行一些命令,并希望参数按原样传递,包括像Powershell 在ScriptBlock中使用转义字符传递变量,powershell,escaping,parameter-passing,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 -Argumen
“
这样的引号。我传递的命令不包括引号,下面是代码:
$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
,但遇到了同样的问题我不确定您想要实现什么,但如果您将参数传递为“XXX”
对于这样的问题,我通常使用[scriptblock]::create()和可展开的here字符串:
$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字符串允许您将任何类型的引号放在任何需要的地方。如果您希望接收的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"""
120>$carg=“`foo``”
121>调用命令{param($myarg,$CArg)echoargs$myarg-CArg$CArg}-ArgumentList myarg,$CArg
arg0是
arg1是
arg2是
命令行:
C:\Program Files(x86)\PowerShell社区扩展\Pscx3\Pscx\Apps\EchoArgs.exe“run-CArg”“foo”
请注意,echoargs是中的一个实用程序,它有助于调试传递给本机exe的参数。您能澄清一下吗?我在下面添加了我的解决方案,出于某种原因,powershell不喜欢@在脚本的开头,我用C#来转义\字符。在C#:File.Open(@“C:\program.exe”)//这相当于:File.Open(“C:\\program.exe”)//对于powershell来说,这些都是相同的,但这不起作用……我不确定您所说的“@在PS中不可接受”是什么意思,但我怀疑您可能没有正确设置here字符串的格式。在here字符串中,开头@可以位于行的任何位置,但结尾“@必须从位置1开始。
$CArg = "`"XXX`""
$string = "&'C:\program.exe' $myarg -CArg" + "$CArg"
$scriptblock = [scriptblock]::create($string)
Invoke-Command -Session $session -Scriptblock $scriptblock
$CArg = "`"XXX`""
$string = "&'C:\program.exe' $myarg -CArg" + "$CArg"
$scriptblock = [scriptblock]::create($string)
Invoke-Command -Session $session -Scriptblock $scriptblock