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 $url
stderr 출력을 생성하고 호스트에 직접 인쇄합니다(계속).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
'programing' 카테고리의 다른 글
가변 함수 인수 기본값에 대한 유용한 사용? (0) | 2023.08.12 |
---|---|
MariaDB: 항목당 월평균 선택(Pivot 테이블) (0) | 2023.08.12 |
단일 Git 커밋에 대해 구성된 사용자 재정의 (0) | 2023.08.12 |
"신호 15 수신"이란 무엇입니까? (0) | 2023.08.12 |
파워셸에서 우아하게 멈춘다. (0) | 2023.08.12 |