0

我需要通过变量在 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"
4

3 回答 3

2

如果要将命令行保存到变量,我建议将其保存ScriptBlockString

$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)"

这样你:

  1. 不必逃避的事情。
  2. 可以将其转换为字符串。
  3. 可以通过调用运算符(&.)调用它。
  4. 在 ISE 中编辑它时会突出显示语法。
  5. 任何语法错误都会在解析时捕获,而不是在执行时捕获。
  6. ScriptBlock链接到其文件和行,因此您可以在其中设置断点。
于 2015-05-21T16:59:57.803 回答
1

虽然我不确定您尝试完成什么的动机,但听起来您正在尝试保存命令$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将执行我们作为代码传递的字符串。

于 2015-05-21T16:27:03.267 回答
0

分配时,需要指定它是一个字符串,否则 Powershell 会尝试执行它。您还需要用双引号将其分隔,并使用反引号转义命令中的双引号和美元符号,以便将它们视为字符串的一部分,而不是结束字符串的分隔符。

$em_result = [string]"gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{`$_ -match 'cajica11'} | %{(`$_ -split `"\s+`")[3]} |  Measure -Sum | Select -Exp Sum'"
于 2015-05-21T15:47:23.180 回答