How to capture error output only in a variable in PowerShell
Solution 1
You can call the command a slightly different way and use the -ErrorVariable
parameter in PowerShell:
Invoke-Expression "$command $params" -ErrorVariable badoutput
$badoutput
will now contain the contents of the error string.
Solution 2
Here is simpler solution by Simon Wahlin using sub expressions
$output = & $command $params 2>&1
Would be:
$errOutput = $( $output = & $command $params ) 2>&1
Solution 3
To add to arco444, the specific exception can be obtained by using $badoutput[0].Exception
.
-ErrorAction and -ErrorVariable has more information on to effectively use the ErrorAction and ErrorVariable parameters built into PowerShell.
Here is the easiest way to show this working:
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
Now one thing that is not obvious to people is that you can specify a “+” in front of the variable name for ErrorVariable and we will ADD the errors to that variable.
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
Lastly, you don’t need to type out –ErrorAction or –ErrorVariable, we have defined parameter aliases for these so you can just type –EA
and -EV
.
Related videos on Youtube
Klas Mellbourn
web developer, consultant, Git enthusiast e-mail: [email protected] GitHub: https://github.com/Mellbourn
Updated on July 10, 2021Comments
-
Klas Mellbourn almost 3 years
I want to store the stderr output of a PowerShell command in a variable. I don't want to store it in a file and I don't want standard output included, just the error output.
This redirects to a file named
error.txt
:& $command $params 2> error.txt
This redirects both stderr and stdout to the $output variable:
$output = & $command $params 2>&1
But I want to store only the error output in a variable (the same as the content of the error.txt file above), without writing anything to file. How do I do that?
-
Ohad Schneider about 8 years
-
Klas Mellbourn about 6 years@NoRefundsNoReturns I was looking to store only the error output, not the whole output.
-
-
Roman about 6 yearsAnd, at least with the most recent version of Powershell, you can capture both stdout and stderr to separate variables and then suppress all output so that you can fully control what happens with the output with: Invoke-Expression "somecommand.exe" -ErrorVariable errOut -OutVariable succOut 2>&1 >$null
-
Franklin Yu about 6 yearsDoesn’t work for me;
Invoke-Expression 'whoami i' -ErrorVariable badoutput
gives nothing in$badoutput
, while I expectedERROR: Invalid argument/option - 'i'. Type "WHOAMI /?" for usage.
. -
Franklin Yu about 6 yearsNever mind. It is simply some PowerShell mess.
-
Carl Walsh over 5 years@ZameerFouzan 1 is stdout, 2 is stderr, and
2>&1
combines stderr into stdout. Then>$null
discards stdout