我试图将输出存储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)
再次没有用,我只需要它在屏幕上以及变量上打印输出。
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。