Powershell 将标准错误重定向到变量

2xM*_*Max 2 powershell powershell-3.0

我想调用任意表达式并将 std 错误重定向到变量而不重定向到文件。

例如,在 Powershell 中,可以使用 2> 运算符重定向标准错误。使用临时文件,我可以轻松获得我想要的内容:

#$expr = "1/0"                          # with std error
#$expr = "2+2"                          # without stderror
#$expr = "Get-Service invalidsvc"       # with stderror
$expr = "try { throw '111' } catch { }" # without std error
$ans = Invoke-Expression $expr -ErrorVariable ev 2> C:\log\stderr.txt
if(cat C:\log\stderr){
    Write-Host "Error $ev"    
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做同样的事情,但不创建临时输出文件?

错误的解决方案:

  1. 使用 -ErrorVariable 开关。反例:

    Invoke-Expression $expr -ErrorVariable ev 2> C:\aaa\file1.txt $expr = "try { throw '111' } catch { }" Write-Host "Error $ev" # 将输出错误,但标准错误是空的

  2. $LASTEXITCODE 和 $? 查看。反例:

    获取服务无效服务

$lastexitcode 等于 0,$? 等于 True,但 std error 不为空

这个想法很简单:将 Powershell 控制台中的“红色”(标准错误)文本保存在变量中。我收到的命令是任意字符串。例子:

  1. 当我在 Powershell 控制台中编写“try { throw '111' } catch { }”时,PS 控制台中不会出现红色(错误)文本(尽管 $error 不为空)。因此,如果我在代码中调用该表达式,则某些变量中不会保存任何错误。

  2. 当我写“Get-Service noteexistingservice”、“1/0”或“Write-Error 111”时,将会出现红色(错误)文本和非空 $error。因此,如果我在代码中调用该表达式,我希望将错误保存在某个变量中。

js2*_*010 6

将标准输出和标准错误保存到单独的变量中。如果没有美元符号,它将无法工作(来自 Windows Powershell in Action)。

$err = $( $output = get-childitem foo3 ) 2>&1
Run Code Online (Sandbox Code Playgroud)