在屏幕和变量中调用表达式输出

时间:2016-05-19 17:23:03

标签: powershell

我正在尝试将Invoke-expression的输出存储到变量和屏幕上。我有PS日志记录,它会自动将所有内容记录为文件中的Write-Host。现在我使用Invoke-Expression似乎要么在屏幕上打印输出,要么在变量上打印,我需要两者

我所尝试的只是:

$var = "C:\ER\work\Canny.exe -Init ER\ER2 Get-ip"

$val = Invoke-Expression $var

这不会在屏幕上打印任何内容,因此我无法知道运行时是否有任何问题。我后来做Write-Host $val来记录它,但有时候为时已晚,无法知道发生了什么 如果我使用:

Invoke-Expression $var

没有记录(显然),但是有控制台输出,如果我想在一段时间后看到日志发生了什么,我无法调查。 我也尝试过:

Invoke-Expression $var -OutVariable out 

OR

Invoke-Expression $var -OutVariable $out 

这在这里没用。我还创建了一个脚本块并尝试使用

Invoke-Command 

但同样没有用,我只需要它在屏幕和变量上打印输出。

3 个答案:

答案 0 :(得分:4)

Invoke-Expression -Command $var -OutVariable out应该工作(变量+控制台输出),但有一些奇怪的事情发生。它适用于ISE,但在普通的PowerShell控制台中,我得到一个空的ArrayList。如果你将它传递给另一个命令,如Out-String它可以工作(但这会返回一个多行字符串)。

Invoke-Expression -Command $var | Out-String -OutVariable out

要么我忘了某件事,要么Invoke-Expression可能是个错误。

解决方法是使用Tee-Object,其行为与-OutVariable相同。

  

Tee-Object cmdlet重定向输出,即发送输出   两个方向的命令(如字母“T”)。它存储了   输出文件或变量,并将其发送到管道。如果   Tee-Object是管道中的最后一个命令,命令输出是   显示在提示符下。

示例:

Invoke-Expression $var -OutVariable | Tee-Object -Variable out 

或(到文件):

Invoke-Expression $var -OutVariable | Tee-Object -FilePath c:\text.txt

请注意,它会覆盖$out中的内容。

答案 1 :(得分:1)

现在可以使用:

Invoke-Expression $ var -OutVariable out | Tee-Object -Variable out

感谢您的帮助

答案 2 :(得分:0)

这是cmdlet Tee-Object派上用场的地方。您可以将Invoke-Command传递给它,并指定是否要将输出存储为变量或文件,并且它将按指定的方式存储数据,并将其传递给管道(将是输出到屏幕,如果这是你想要的。)

Invoke-Expression $var | Tee-Object C:\Path\To\File.txt