PowerShell의 표준 오류에 쓰는 방법은 무엇입니까?
표준 오류 스트림에 에코하는 방법과 실행 파일의 오류 스트림을 리디렉션하는 방법을 모두 파악하는 데 어려움을 겪고 있습니다.
저는 본 셸과 콘 셸 배경에서 왔습니다. 제가 사용할 것입니다.
# Write to stderr
echo "Error Message!" >&2
# Redirect stderr to file
/do/error 2>/tmp/err.msg
사용하다Write-Error
stderr에 글을 . stderr 을로파다면사음용다니합을려를 합니다.
Write-Error "oops" 2> /temp/err.msg
또는
exe_that_writes_to_stderr.exe bogus_arg 2> /temp/err.msg
PowerShell은 오류를 오류 레코드로 기록합니다.오류 레코드의 자세한 출력을 방지하려면 다음과 같이 오류 정보를 직접 작성할 수 있습니다.
PS> Write-Error "oops" -ev ev 2>$null
PS> $ev[0].exception
oops
-EV
의줄가입니칭다말임▁(다의 줄임말(입니다.-ErrorVariable
모든 오류는 이 매개 변수에 대한 인수로 명명된 변수에 저장됩니다.를 "PowerShell" "PowerShell" "PowerShell"으로 한 합니다.$null
.
참고:
이 답변은 PowerShell 스크립트가 외부에서 호출될 때 외부의 관점에서 stderr에게 글을 쓰는 것에 관한 것입니다. 반면 Windows 셸의 관점에서 글을 쓰는 동안,
cmd.exe
다음과 같은 유닉스 셸에도 동일하게 적용됩니다.bash
PowerShell Core 버전반대로 Powershell 내에서는 다음을 사용해야 합니다.
Write-Error
키스 힐의 대답에 설명된 바와 같이.안타깝게도 PowerShell 내부와 외부 모두에서 작동할 수 있는 통합 접근 방식은 없습니다. 자세한 내용은 이 답변을 참조하십시오.
@Chris Sear의 훌륭한 답변에 추가하기:
하는 동안에$host.ui.WriteErrorLine
모든 호스트에서 작동해야 하지만 (기본적으로) 배치 파일과 같이 를 통해 호출될 때 stderr에 쓰지 않습니다. 이와 대조적으로 항상 작동합니다.
따라서 에서 호출할 때 출력 스트림 측면에서 잘 재생되는 PowerShell 스크립트를 작성하려면 다음 함수를 사용합니다.Write-StdErr
어떤 것을 사용합니까?[Console]::Error.WriteLine
PS에서 / 정에 PS에서 /cmd.exe
호스트(호스트 창),$host.ui.WriteErrorLine
그렇지 않은 경우:
<#
.SYNOPSIS
Writes text to stderr when running in a regular console window,
to the host''s error stream otherwise.
.DESCRIPTION
Writing to true stderr allows you to write a well-behaved CLI
as a PS script that can be invoked from a batch file, for instance.
Note that PS by default sends ALL its streams to *stdout* when invoked from
cmd.exe.
This function acts similarly to Write-Host in that it simply calls
.ToString() on its input; to get the default output format, invoke
it via a pipeline and precede with Out-String.
#>
function Write-StdErr {
param ([PSObject] $InputObject)
$outFunc = if ($Host.Name -eq 'ConsoleHost') {
[Console]::Error.WriteLine
} else {
$host.ui.WriteErrorLine
}
if ($InputObject) {
[void] $outFunc.Invoke($InputObject.ToString())
} else {
[string[]] $lines = @()
$Input | % { $lines += $_.ToString() }
[void] $outFunc.Invoke($lines -join "`r`n")
}
}
선택적 배경 정보:외부 호출자가 PowerShell CLI의 출력 스트림을 보는 방법:
내부적으로 PowerShell은 기존의 출력 스트림(stdout 및 stderr)보다 더 많은 것을 보유하고 있으며, 시간이 지남에 따라 그 수가 증가했습니다(시도).Write-Warning "I'll go unheard." 3> $null
예를 들어 자세한 내용은 에서 참조하십시오.
외부와 인터페이스할 때 PowerShell은 기존의 출력 스트림이 아닌 것을 stdout 및 stderr에 매핑해야 합니다.
그러나 PowerShell의 오류 스트림을 stderr에 매핑하는 것이 논리적 선택임에도 불구하고 PowerShell은 기본적으로 에서 호출될 때 모든 스트림(및 출력 포함)을 stdout으로 보냅니다.이 동작은 (최소한) v2 이후부터 적용되었으며 v5.1 현재에도 적용됩니다(이전 버전과의 호환성을 위해 변경되지 않을 수 있습니다. GitHub 문제 #7989 참조).
에서 호출할 경우 다음 명령을 사용하여 이를 확인할 수 있습니다.
powershell -noprofile -command "'out'; Write-Error 'err'; Write-Warning 'warn'; Write-Verbose -Verbose 'verbose'; $DebugPreference='Continue'; write-debug 'debug'; $InformationPreference='Continue'; Write-Information 'info'; Write-Host 'host'; $host.ui.WriteErrorLine('uierr'); [Console]::Error.WriteLine('cerr')" >NUL
은 모든 스트림에 이전 PowerShell과 메시지가됩니다).Write-Information
PowerShell v5)에 포함되어 .cmd.exe
stdout만 리디렉션NUL
(즉, stdout 출력 억제;>NUL
).
다음을 제외하고는 출력이 표시되지 않습니다.cerr
((으)부터[Console]::Error.WriteLine()
- stderr로 되었습니다. - PowerShell의 stdout은 stdout입니다.
아마도 더욱 이상하게도 PowerShell의 오류 스트림을 캡처할 수 있지만 리디렉션이 있어야 합니다.
변경할 경우>NUL
2>NUL
위는 PowerShell의 오류 스트림이며$host.ui.WriteErrorLine()
출력이 억제됩니다. 물론 다른 리디렉션과 마찬가지로 파일로 보낼 수도 있습니다. (설명한 대로,[Console]::Error.WriteLine()]
후자가 리디렉션되는지 여부에 관계없이 항상 stderr로 출력합니다.)
좀 더 집중적인 예를 제시하려면(다시, 에서 실행)cmd.exe
):
powershell -noprofile -command "'out'; Write-Error 'err'" 2>NUL
위의 출력만 해당됩니다.out
-Write-Error
의 출력이 억제됩니다.
요약:
것도 없이 (아것도없이무▁(이없▁without▁any)
cmd.exe
) 리디렉션 또는 stdout 리디렉션만 사용(>...
또는1>...
), PowerShell은 모든 출력 스트림을 stdout으로 보냅니다.stderr 리디렉션 포함(
2>...
), PowerShell은 오류 스트림을 선택적으로 stderr로 전송합니다(stdout도 리디렉션되는지 여부에 관계없이).결과적으로, 다음의 일반적인 관용구는 예상대로 작동하지 않습니다.
powershell ... >data-output.txt
이렇게 하면 예상대로 stdout만 파일로 전송되지 않습니다.data-output.txt
터미널로 stderr 출력을 인쇄하는 동안, 대신에, 당신은 사용해야 할 것입니다.powershell ... >data-output.txt 2>err-output.tmp; type err-output.tmp >&2; del err-output.tmp
따라서 PowerShell은 의 리디렉션을 인식하고 의도적으로 동작을 조정합니다. (이는 PowerShell에서 컬러 출력을 생성하는 경우에도 분명합니다.)cmd.exe
출력이 파일로 리디렉션될 때 색상 코드를 제거하는 동안 콘솔을 사용합니다.
당신은 아마 이것을 원할 것입니다.
$host.ui.WriteErrorLine('I work in any PowerShell host')
다음과 같은 내용도 표시될 수 있지만 PowerShell 호스트가 콘솔 창/장치라고 가정하므로 유용하지 않다고 생각합니다.
[Console]::Error.WriteLine('I will not work in the PowerShell ISE GUI')
언급URL : https://stackoverflow.com/questions/4998173/how-do-i-write-to-standard-error-in-powershell
'source' 카테고리의 다른 글
페이지의 다른 곳에서 클릭하여 트위터 부트스트랩 팝업을 닫으려면 어떻게 해야 합니까? (0) | 2023.08.02 |
---|---|
브라우저에서 OS가 어두운 모드인지 감지하는 방법은 무엇입니까? (0) | 2023.07.28 |
'root'@'localhost' 사용자에 대한 액세스가 거부되었습니다(암호 사용: 아니요).' (0) | 2023.07.28 |
파워셸에서 문(블록)을 사용하여 구현하는 방법은 무엇입니까? (0) | 2023.07.28 |
PowerShell을 사용하여 레지스트리 값과 한 줄로 연결되는 경로를 생성하려면 어떻게 해야 합니까? (0) | 2023.07.28 |