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

How to capture error output only in a variable in PowerShell

我想将 PowerShell 命令的 stderr 输出存储在一个变量中。我不想将它存储在一个文件中,我不想包含标准输出,只是错误输出。

这将重定向到名为 error.txt:

的文件

& $command $params 2> error.txt

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

$output = & $command $params 2>&1

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

您可以用稍微不同的方式调用命令并在 PowerShell 中使用 -ErrorVariable 参数:

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

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

添加arco444,具体异常可以使用$badoutput[0].Exception获取。

-ErrorAction and -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.

这里是 Simon Wahlin 使用子表达式

的更简单的解决方案

$output = & $command $params 2>&1

将是:

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