如何仅在 PowerShell 中的变量中捕获错误输出

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

我想将 PowerShell 命令的 stderr 输出存储在变量中。我不想将其存储在文件中,也不希望包含标准输出,只想包含错误输出。

这会重定向到名为

error.txt
:

的文件

& $command $params 2> error.txt

这会将 stderr 和 stdout 重定向到 $output 变量:

$输出=&$命令$参数2>&1

但我只想将错误输出存储在变量中(与上面 error.txt 文件的内容相同),而不向文件写入任何内容。我该怎么做?

powershell error-handling stream
4个回答
35
投票
-ErrorVariable

参数:


Invoke-Expression "$command $params" -ErrorVariable badoutput

$badoutput

现在将包含错误字符串的内容。

    


20
投票
Simon Wahlin

使用子表达式的更简单的解决方案

$输出=&$命令$参数2>&1

将是:

$errOutput = $( $output = & $command $params ) 2>&1



1
投票
$badoutput[0].Exception

获取。


-ErrorAction 和 -ErrorVariable 有关如何有效使用 PowerShell 中内置的 ErrorAction 和 ErrorVariable 参数的更多信息。 这是展示此功能的最简单方法:

PS> Stop-Process 13,23 Stop-Process : Cannot find a process with the process identifier 13. At line:1 char:13 + Stop-Process <<<< 13,23 Stop-Process : Cannot find a process with the process identifier 23. At line:1 char:13 + Stop-Process <<<< 13,23 PS> Stop-Process 13,23 -ErrorAction Stop # Only 1 error Stop-Process : Command execution stopped because the shell variable “ErrorA ctionPreference” is set to Stop: Cannot find a process with the process ide ntifier 13. At line:1 char:13 + Stop-Process <<<< 13,23 -ErrorAction Stop # Only 1 error PS> Stop-Process 13,23 -ErrorAction silentlycontinue # No errors PS> Stop-Process 13,23 -ErrorAction inquire # ASK Confirm Cannot find a process with the process identifier 13. [Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is “Y”):h Stop-Process : Command execution stopped because the user selected the Halt option. At line:1 char:13 + Stop-Process <<<< 13,23 -ErrorAction inquire # ASK PS> PS> PS> Stop-Process 13,23 -ErrorVariable a -ErrorAction SilentlyContinue PS> $a[0] Stop-Process : Cannot find a process with the process identifier 13. At line:1 char:13 + Stop-Process <<<< 13,23 -ErrorVariable a -ErrorAction SilentlyContinue PS> $a[0] |fl * -Force Exception : Microsoft.PowerShell.Commands.ProcessCommandExcepti on: Cannot find a process with the process identifi er 13. TargetObject : 13 CategoryInfo : ObjectNotFound: (13:Int32) [Stop-Process], ProcessC ommandException FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Comma nds.StopProcessCommand ErrorDetails : InvocationInfo : System.Management.Automation.InvocationInfo PS> $a |ft TargetObject -force -auto TargetObject ———— 13 23

现在人们不明显的一件事是,您可以在 ErrorVariable 的变量名前面指定一个“+”,我们会将错误添加到该变量中。

PS> $err=@() PS> stop-process 13 -ea silentlycontinue -ErrorVariable err PS> $err.count 1 PS> stop-process 23 -ea silentlycontinue -ErrorVariable +err PS> $err.count 2 PS> $err Stop-Process : Cannot find a process with the process identifier 13. At line:1 char:13 + stop-process <<<< 13 -ea silentlycontinue -ErrorVariable err Stop-Process : Cannot find a process with the process identifier 23. At line:1 char:13 + stop-process <<<< 23 -ea silentlycontinue -ErrorVariable +err

最后,您不需要输入 –ErrorAction 或 –ErrorVariable,我们已经为这些定义了参数别名,因此您只需输入 
–EA

-EV
    


0
投票

Linux + PowerShell 7.2.16、PowerShell 7.3.2

PS> $s={ /bin/echo "Hello" /bin/ls "/errortext" Write-Error "Booo" Write-Host "Bello" Write-Output "World" } PS> $err456 = (Invoke-Command -ScriptBlock $s ` -OutVariable out123 ` -ErrorVariable err123 ` 1>$null ) 2>&1 Bello PS> $out123 Hello World PS> $err123 Write-Error: Booo PS> $err456 /bin/ls: cannot access '/errortext': No such file or directory Write-Error: Booo

© www.soinside.com 2019 - 2024. All rights reserved.