How to capture error output only in a variable in PowerShell

后端 未结 2 1981
暖寄归人
暖寄归人 2021-02-18 15:57

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.

相关标签:
2条回答
  • 2021-02-18 16:11

    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.

    0 讨论(0)
  • 2021-02-18 16:13

    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.

    0 讨论(0)
提交回复
热议问题