我需要通过变量在 Powershell 上打印一行命令,我调用了 $em_result,例如,em_result=20,谢谢。
$em_result = ´gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} | Measure -Sum | Select -Exp Sum'´
Write-Host"$em_result"
我需要通过变量在 Powershell 上打印一行命令,我调用了 $em_result,例如,em_result=20,谢谢。
$em_result = ´gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} | Measure -Sum | Select -Exp Sum'´
Write-Host"$em_result"
如果要将命令行保存到变量,我建议将其保存ScriptBlock
为String
:
$em_result = {gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} | Measure -Sum | Select -Exp Sum'}
Write-Host "`$em_result = $(&$em_result)"
这样你:
&
或.
)调用它。ScriptBlock
链接到其文件和行,因此您可以在其中设置断点。虽然我不确定您尝试完成什么的动机,但听起来您正在尝试保存命令$em_result
,以便您可以在需要时运行。这样一来,您就不会保存时间点结果,而是每次调用它时,结果都是从那个时间开始的。
就像Tony Hinkle回答的那样,您需要将命令保存为字符串。然而,除了引号之外,还有更多要逃避的东西。管道变量$_
也将发挥作用。因为它是一个简单的here-string,所以你不必担心转义任何东西。
$em_result = @'
gc 'C:\Users\mtmachadost\Desktop\Test\logError.txt' | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} | Measure -Sum | Select -Exp Sum
'@
现在你可以调用这个字符串并得到结果
Write-Host "`$em_result = $(Invoke-Expression $em_result)"
我猜你是在尝试使用反引号和转义引号对,这让我觉得这就是你想要的。反引号只会转义后面的一个字符。Invoke-Expression
将执行我们作为代码传递的字符串。
分配时,需要指定它是一个字符串,否则 Powershell 会尝试执行它。您还需要用双引号将其分隔,并使用反引号转义命令中的双引号和美元符号,以便将它们视为字符串的一部分,而不是结束字符串的分隔符。
$em_result = [string]"gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{`$_ -match 'cajica11'} | %{(`$_ -split `"\s+`")[3]} | Measure -Sum | Select -Exp Sum'"