How do I suppress standard error output in PowerShell?

前端 未结 5 2253
情深已故
情深已故 2020-12-29 05:06

In a PowerShell script automating some SVN tasks I have the following function:

function SvnUrlExists($url)
{
  svn info $url | out-null 2>&1
  return         


        
相关标签:
5条回答
  • 2020-12-29 05:41

    The voted answer generates an error for me. The solution ended up being the following:

    cmd /c "MyProgram MyArguments 2>&1" | Out-Null
    
    0 讨论(0)
  • 2020-12-29 05:42

    One can also do this:

    svn info $url *> $null
    

    See Suppress console output in PowerShell

    about_Redirection

    0 讨论(0)
  • 2020-12-29 05:46

    If you want to suppress only standard error, use:

    svn info $url 2>$null
    
    0 讨论(0)
  • 2020-12-29 05:52

    Just in case someone else googles for similar terms as I did:

    After I have been banging my forehead against this for hours, of course I found the solution within minutes after posting the question here:

    svn info $url 2>&1 | out-null
    

    This works like a charm.

    0 讨论(0)
  • 2020-12-29 06:08

    tl;dr

    function SvnUrlExists($url)
    {
    
      # Suppress all output streams (external stdout and stderr in this case)
      # To suppress stderr output only, use 2>$null
      svn info $url *>$null 
    
      # For predictable results with external programs, 
      # infer success from the *process exit code*, not from the automatic $? variable.
      # See https://github.com/PowerShell/PowerShell/issues/10512
      $LASTEXITCODE -eq 0
    }
    

    Your own answer effectively addresses the redirection issue.

    Steven Penny's answer proposes *>$null, i.e. suppressing all output streams as a convenient alternative - it obviates the need for Out-Null, which I generally suggest replacing with $null = ... - see this answer.

    However, there's another problem with the code in your question:

    While it may work with your particular command, $?, unfortunately, is not a robust indicator of whether an external program succeeded or not - use $LASTEXITCODE -eq 0 instead, because - due to a bug as of PowerShell Core 7.0.0-preview.3, reported on GitHub here - $? can end up reflecting $false even when $LASTEXITCODE is 0 (unequivocally signaling success).


    As for what you tried in your question:

    svn info $url | out-null 2>&1  # WRONG
    
    • Only success output is sent through to the pipeline (stdout output from external programs is sent to PowerShell's success output stream).

    • Redirections such as 2>&1 act on individual commands in a pipeline, not the pipeline as a whole.

    • Therefore, if svn info $url produces stderr output, it prints straight to the host (console) - Out-Null never sees it.

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