How to capture error messages thrown by a command?

后端 未结 3 615
南笙
南笙 2020-12-29 12:47

I am writing a PowerShell script where in I need to capture the error message that it\'s throwing. Note: according to PowerShell, there is no error and command is executed s

相关标签:
3条回答
  • 2020-12-29 13:10

    If you get an error message, you need to capture the error stream:

    $msg = command 2>&1
    

    or

    command 2>error.txt
    

    PowerShell writes its messages to different streams that can be redirected to files for capturing the respective output.

    • Stream 1 (default): regular output ("STDOUT")
    • Stream 2: error messages ("STDERR"), including error messages from external programs
    • Stream 3: warning messages
    • Stream 4: verbose messages
    • Stream 5: debug messages
    • Stream 6: information messages (only PowerShell v5 and newer)

    To capture a particular stream in a file you need to redirect the stream number to a file name. For instance

    command 2>"C:\path\to\error.log"
    

    would capture all error messages produced by command in the file C:\path\to\error.log. Use 2>> instead of 2> if you want to append to the file instead of overwriting it with each run.

    You can also combine other streams with STDOUT to process/redirect all command output:

    command >>"C:\path\to\all.log" *>&1
    

    See Get-Help about_Redirection or this Scripting Guy article for more information about streams and redirection.

    Things worth of note:

    • The *> redirection was introduced with PowerShell v3, hence it won't work in PowerShell v2 and earlier.
    • PowerShell v5 introduced a new stream (Information, stream number 6) since people kept misusing Write-Host because they didn't understand what the cmdlet was intended for.
    0 讨论(0)
  • 2020-12-29 13:16

    Assuming your executable is named svn.exe and is on the path, you can capture the messages it sends to console this way:

    $msg = [string] (svn.exe <your parameters here>)
    

    You can then parse the $msg string to find information you need.

    0 讨论(0)
  • 2020-12-29 13:24

    Inspired by David Brabants answer, you can combine both stdout and stderr into one string array using this command:

    $output = [string[]] (.\Cli.exe -p $param 2>&1)
    

    It will execute Cli.exe with the parameter p. This is optionally.

    Clarification

    2>&1 means the stream #2 (stderr) will be redirected to stream #1 (stdout), thus both streams will arrive in $output.

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