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

问题描述 投票:0回答:2

我正在尝试将

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 

Invoke-Expression $var -OutVariable $out 

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

Invoke-Command 

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

powershell
2个回答
13
投票

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 | Tee-Object -Variable out 

或(到文件):

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

请注意,它会覆盖

$out
中的内容。


2
投票

这就是 cmdlet

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

Invoke-Expression $var | Tee-Object C:\Path\To\File.txt
© www.soinside.com 2019 - 2024. All rights reserved.