我正在尝试将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
但同样没有用,我只需要它在屏幕和变量上打印输出。
答案 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