Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 在ScriptBlock中使用转义字符传递变量_Powershell_Escaping_Parameter Passing - Fatal编程技术网

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

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

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

我不确定您想要实现什么,但如果您将参数传递为“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