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

Aks*_*hay 4 powershell

我试图将输出存储Invoke-expression到一个变量以及在屏幕上。我有PS日志记录,它会自动将所有内容记录为Write-Host一个文件。现在我正在使用Invoke-Expression它似乎在屏幕上打印输出或到一个变量,我都需要

我所尝试的是:

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

$val = Invoke-Expression $var
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression $var
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression $var -OutVariable out 
Run Code Online (Sandbox Code Playgroud)

要么

Invoke-Expression $var -OutVariable $out 
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Command 
Run Code Online (Sandbox Code Playgroud)

再次没有用,我只需要它在屏幕上以及变量上打印输出。

Fro*_* F. 5

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

Invoke-Expression -Command $var | Out-String -OutVariable out
Run Code Online (Sandbox Code Playgroud)

我忘记了什么,或者可能是的错误Invoke-Expression

一种解决方法是使用Tee-Object与行为相同的方法-OutVariable

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

例:

Invoke-Expression $var -OutVariable | Tee-Object -Variable out 
Run Code Online (Sandbox Code Playgroud)

或(至文件):

Invoke-Expression $var -OutVariable | Tee-Object -FilePath c:\text.txt
Run Code Online (Sandbox Code Playgroud)

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