programing

PowerShell에서 표준 오류 출력을 억제하려면 어떻게 해야 합니까?

newstyles 2023. 8. 12. 10:05

PowerShell에서 표준 오류 출력을 억제하려면 어떻게 해야 합니까?

일부 SVN 작업을 자동화하는 PowerShell 스크립트에는 다음과 같은 기능이 있습니다.

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

일부 SVN 저장소 URL이 존재하는지 여부를 명시적으로 테스트하기 때문에 오류 출력에는 전혀 관심이 없습니다.하지만 리다이렉트에 대한 모든 것에도 불구하고stderr에서 PowerShell을 합니다.2>&1을 렉션로리로 합니다.stdout이 경우에도 오류 메시지가 출력됩니다.

svn: 경고: W170000: URL 'blahblah'가 개정 26762에 없습니다.svn: E200009:일부 대상이 없으므로 일부 대상에 대한 정보를 표시할 수 없습니다.

유감스럽게도, 이것은 내 스크립트의 출력을 심각하게 엉망으로 만듭니다.

내가 무엇을 잘못하고 있으며, 이 오류 출력을 어떻게 억제해야 합니까?

표준 오류만 표시하지 않으려면 다음을 사용합니다.

svn info $url 2>$null

다른 사람이 저와 비슷한 조건으로 구글을 검색할 경우:

몇 시간 동안 이 문제에 대해 이마를 부딪친 후, 물론 여기에 질문을 올린 후 몇 분 안에 해결책을 찾았습니다.

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

이것은 매력적으로 작동합니다.

다음과 같은 작업도 수행할 수 있습니다.

svn info $url *> $null

자세한 내용은 PowerShell에서 콘솔 출력 억제를 참조하십시오.

정보_방향 수정

투표된 답변은 저에게 오류를 발생시킵니다.해결책은 다음과 같습니다.

cmd /c "MyProgram MyArguments 2>&1" | Out-Null

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
}

자신답변으로 리디렉션 문제를 효과적으로 해결할 수 있습니다.

스티븐 페니의 대답은 다음과 같습니다.*>$null즉, 편리한 대안으로 모든 출력 스트림을 억제합니다. 즉, 필요하지 않습니다.Out-Null으로 제안하는 것은 다할것제안니로 입니다.$null = ... 답을 보세요.

그러나 질문에 있는 코드에는 또 다른 문제가 있습니다.

사용자의 특정 명령으로 작동할 수는 있지만, 안타깝게도 외부 프로그램의 성공 여부를 나타내는 강력한 지표는 아닙니다. 대신 사용하십시오. 왜냐하면 여기 GitHub에서 보고된 PowerShell Core 7.0.0-preview.3의 버그로 인해 -$?결국 반영될 수 있습니다.$false도 때에도.$LASTEXITCODE이라0(언어적으로 성공의 신호를 보냅니다.)

  • 업데이트: v7.2 이전 실험 기능의 이름을 지정한 경우PSNotApplyErrorActionToStderr공식 기능이 되면 이 문제는 해결됩니다. 자세한 내용은 이 답변을 참조하십시오.

질문에서 시도한 내용에 대해서는

svn info $url | out-null 2>&1  # WRONG
  • 성공 출력만 파이프라인으로 전송됩니다(외부 프로그램의 stdout 출력은 PowerShell의 성공 출력 스트림으로 전송됨).

  • 다음과 같은 리디렉션2>&1파이프라인 전체가 아닌 파이프라인의 개별 명령에 대해 작업합니다.

  • 그러므로, 만약svn info $urlstderr 출력을 생성하고 호스트에 직접 인쇄합니다(계속).Out-Null절대 보지 않습니다.

주의할 점은 일부 Powershell cmdlet이 이러한 방법으로 올바르게 작동하지 않는다는 것입니다.그러한 예는Get-ADUser어떤 트릭을 사용하든 실패할 경우 오류를 출력합니다.

PS C:\Temp\2022-09-05T08-28-46_oexvijzd.tfq> Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" 2>&1 | Out-Null
Get-ADUser : Directory object not found
At line:1 char:1
+ Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" 2>&1 | Ou ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CN=administrator,DC=acme,DC=internal:ADUser) [Get-ADUser], ADIdentityNotFoundException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
PS C:\Temp\2022-09-05T08-28-46_oexvijzd.tfq> Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" *>$null
Get-ADUser : Directory object not found
At line:1 char:1
+ Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" *>$null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CN=administrator,DC=acme,DC=internal:ADUser) [Get-ADUser], ADIdentityNotFoundException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
PS C:\Temp\2022-09-05T08-28-46_oexvijzd.tfq> Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" *>$null | Out-Null *>$null
Get-ADUser : Directory object not found
At line:1 char:1
+ Get-ADUser -Identity "CN=administrator,DC=acme,DC=internal" *>$null | ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (CN=administrator,DC=acme,DC=internal:ADUser) [Get-ADUser], ADIdentityNotFoundException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

이런 경우, 당신은 다음을 만들어야 할 것입니다.try/catch차단하거나 다른 대안을 찾습니다(예: AD 개체의 존재 확인, 보기 흉한 오류 메시지를 방지하려면 어떻게 해야 합니까?).

이것이 누군가의 비생산적인 머리 긁힘을 덜어주기를 바랍니다.

언급URL : https://stackoverflow.com/questions/11969596/how-do-i-suppress-standard-error-output-in-powershell