about_Redirection
간단한 설명
출력을 PowerShell에서 텍스트 파일로 리디렉션하는 방법을 설명합니다.
자세한 설명
기본적으로 PowerShell은 출력을 PowerShell 호스트로 보냅니다. 일반적으로 콘솔 애플리케이션입니다. 그러나 출력을 텍스트 파일로 리디렉션할 수 있으며 오류 출력을 일반 출력 스트림으로 리디렉션할 수 있습니다.
다음 메서드를 사용하여 출력을 리디렉션할 수 있습니다.
명령 출력을
Out-File
텍스트 파일로 보내는 cmdlet을 사용합니다. 일반적으로 cmdlet은Out-File
해당 매개 변수(예:Encoding
,Force
,Width
또는NoClobber
매개 변수)를 사용해야 할 때 사용합니다.명령 출력을
Tee-Object
텍스트 파일로 보낸 다음 파이프라인으로 보내는 cmdlet을 사용합니다.PowerShell 리디렉션 연산자를 사용합니다. 리디렉션 연산
>
자()를 사용하여 PowerShell 명령(cmdlet, 함수, 스크립트)의 출력을 리디렉션하는 것은 추가 매개 변수 없이 파이핑과Out-File
기능적으로 동일합니다. PowerShell 7.4는 네이티브 명령의 stdout 스트림을 리디렉션하는 데 사용할 때 리디렉션 연산자의 동작을 변경했습니다.
스트림에 대한 자세한 내용은 about_Output_스트림 참조하세요.
리디렉션 가능한 출력 스트림
PowerShell은 다음 출력 스트림의 리디렉션을 지원합니다.
스트림 # | 설명 | 소개 | 쓰기 Cmdlet |
---|---|---|---|
1 | 성공 스트림 | PowerShell 2.0 | Write-Output |
2 | 오류 스트림 | PowerShell 2.0 | Write-Error |
3 | 경고 스트림 | PowerShell 3.0 | Write-Warning |
4 | 자세한 정보 표시 스트림 | PowerShell 3.0 | Write-Verbose |
5 | 디버그 스트림 | PowerShell 3.0 | Write-Debug |
6 | 정보 스트림 | PowerShell 5.0 | Write-Information , Write-Host |
* | 모든 스트림 | PowerShell 3.0 |
PowerShell에는 진행률 스트림도 있지만 리디렉션을 지원하지 않습니다.
Important
성공 및 오류 스트림은 다른 셸의 stdout 및 stderr 스트림과 유사합니다. 그러나 stdin은 입력을 위해 PowerShell 파이프라인에 연결되지 않습니다.
PowerShell 리디렉션 연산자
PowerShell 리디렉션 연산자는 스트림 번호를 나타내는 다음과 같습니다 n
. 스트림이 지정되지 않은 경우 성공 스트림( 1
)이 기본값입니다.
Operator | 설명 | 구문 |
---|---|---|
> |
지정된 스트림을 파일로 보냅니다. | n> |
>> |
지정된 스트림을 파일에 추가 합니다. | n>> |
>&1 |
지정된 스트림을 성공 스트림으로 리디렉션합니다. | n>&1 |
참고 항목
일부 Unix 셸과 달리 다른 스트림만 성공 스트림으로 리디렉션할 수 있습니다.
네이티브 명령에서 출력 리디렉션
PowerShell 7.4는 네이티브 명령의 stdout 스트림을 리디렉션하는 데 사용할 때 리디렉션 연산자의 동작을 변경했습니다. 이제 리디렉션 연산자는 네이티브 명령에서 출력을 리디렉션할 때 바이트 스트림 데이터를 유지합니다. PowerShell은 리디렉션된 데이터를 해석하거나 추가 서식을 추가하지 않습니다. 자세한 내용은 예제 #7을 참조하세요.
예제
예제 1: 오류 및 출력을 파일로 리디렉션
이 예제는 성공한 항목 하나와 실패한 항목에서 실행됩니다 dir
.
dir C:\, fakepath 2>&1 > .\dir.log
오류 스트림을 성공 스트림으로 리디렉션하고 >
결과 성공 스트림을 호출된 파일로 보내는 데 사용됩니다2>&1
.dir.log
예제 2: 모든 성공 스트림 데이터를 파일로 보내기
이 예제에서는 모든 성공 스트림 데이터를 호출 script.log
된 파일로 보냅니다.
.\script.ps1 > script.log
예제 3: 성공, 경고 및 오류 스트림을 파일로 보내기
이 예제에서는 리디렉션 연산자를 결합하여 원하는 결과를 얻을 수 있는 방법을 보여줍니다.
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
3>&1
는 경고 스트림을 성공 스트림으로 리디렉션합니다.2>&1
오류 스트림을 성공 스트림으로 리디렉션합니다(이제 모든 경고 스트림 데이터도 포함됨).>
는 이제 경고 및 오류 스트림을 모두 포함하는 성공 스트림을 라는C:\temp\redirection.log
파일로 리디렉션합니다.
예제 4: 모든 스트림을 파일로 리디렉션
이 예제에서는 호출된 스크립트의 모든 스트림 출력을 호출 script.ps1
script.log
된 파일로 보냅니다.
.\script.ps1 *> script.log
예제 5: 모든 쓰기 호스트 및 정보 스트림 데이터 표시 안 함
다음은 모든 정보 스트림 데이터를 표시하지 않는 예제입니다. 정보 스트림 cmdlet에 대한 자세한 내용은 Write-Host 및 Write-Information을 참조하세요.
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
예제 6: 작업 기본 설정의 효과 표시
작업 기본 설정 변수 및 매개 변수는 특정 스트림에 기록되는 내용을 변경할 수 있습니다. 이 예제의 스크립트는 값 $ErrorActionPreference
이 오류 스트림에 기록되는 내용에 미치는 영향을 보여 줍니다.
$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
get-item /not-here 2>&1 >> log.txt
}
catch {
"`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Continue'
이 스크립트를 실행하면 로 설정된 Inquire
경우 $ErrorActionPreference
메시지가 표시됩니다.
PS C:\temp> .\test.ps1
Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
23 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The running command stopped because the user selected the Stop option.
로그 파일을 검사하면 다음이 표시됩니다.
PS C:\temp> Get-Content .\log.txt
Continue
Get-Item: C:\temp\test.ps1:3
Line |
3 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot find path 'C:\not-here' because it does not exist.
SilentlyContinue
Stop
Error caught!
Ignore
Inquire
예제 7: 네이티브 명령에서 이진 데이터 리디렉션
PowerShell 7.4부터 PowerShell은 네이티브 명령의 stdout 스트림을 파일로 리디렉션하거나 바이트 스트림 데이터를 네이티브 명령의 stdin 스트림으로 파이핑할 때 바이트 스트림 데이터를 유지합니다.
예를 들어 네이티브 명령을 curl
사용하여 이진 파일을 다운로드하고 리디렉션을 사용하여 디스크에 저장할 수 있습니다.
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
바이트 스트림 데이터를 다른 네이티브 명령의 stdin 스트림으로 파이프할 수도 있습니다. 다음 예제에서는 을 사용하여 curl
압축된 TAR 파일을 다운로드합니다.
다운로드한 파일 데이터는 보관 파일의 tar
내용을 추출하기 위해 명령으로 스트리밍됩니다.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
PowerShell 명령의 바이트 스트림 출력을 네이티브 명령의 입력으로 파이프할 수도 있습니다. 다음 예제에서는 이전 예제와 동일한 TAR 파일을 다운로드하는 데 사용합니다 Invoke-WebRequest
.
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
이 기능은 stderr 출력을 stdout으로 리디렉션할 때 바이트 스트림 데이터를 지원하지 않습니다. stderr 및 stdout 스트림을 결합하면 결합된 스트림이 문자열 데이터로 처리됩니다.
주의
데이터를 추가하지 않는 리디렉션 연산자(>
및 n>
)는 지정된 파일의 현재 내용을 경고 없이 덮어씁니다.
그러나 파일이 읽기 전용, 숨겨진 파일 또는 시스템 파일인 경우 리디렉션 이 실패합니다. 추가 리디렉션 연산자(>>
및 n>>
)는 읽기 전용 파일에 쓰지 않지만 시스템 또는 숨겨진 파일에 콘텐츠를 추가합니다.
콘텐츠를 읽기 전용, 숨겨진 또는 시스템 파일로 강제로 리디렉션하려면 해당 매개 변수와 함께 cmdlet을 Out-File
Force
사용합니다.
파일에 쓸 때 리디렉션 연산자는 인코딩을 사용합니다 UTF8NoBOM
. 파일에 다른 인코딩이 있는 경우 출력의 형식이 올바르게 지정되지 않을 수 있습니다. 다른 인코딩을 사용하여 파일에 쓰려면 해당 매개 변수와 Out-File
함께 cmdlet을 Encoding
사용합니다.
파일에 쓸 때의 출력 너비
리디렉션 연산자 또는 Out-File
리디렉션 연산자를 사용하여 파일에 쓸 때 PowerShell은 실행 중인 콘솔의 너비에 따라 테이블 출력의 형식을 파일에 지정합니다. 예를 들어 콘솔 너비가 80열로 설정된 시스템과 같은 Get-ChildItem Env:\Path > path.log
명령을 사용하여 파일에 테이블 출력을 로깅할 때 파일의 출력은 80자로 잘립니다.
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
스크립트가 실행되는 시스템에서 콘솔 너비를 임의로 설정할 수 있다는 점을 고려할 때 PowerShell 형식 테이블 출력은 사용자가 지정한 너비에 따라 파일에 출력하는 것이 좋습니다.
cmdlet은 Out-File
테이블 출력에 원하는 너비를 설정할 수 있는 Width 매개 변수를 제공합니다. 호출Out-File
하는 모든 위치에 추가 -Width 2000
하지 않고 변수를 $PSDefaultParameterValues
사용하여 스크립트에서 cmdlet의 Out-File
모든 사용량에 대해 이 값을 설정할 수 있습니다. 또한 리디렉션 연산자(>
및 >>
)는 사실상 별칭 Out-File
이므로 전체 스크립트에 대한 매개 변수를 설정 Out-File:Width
하면 리디렉션 연산자의 서식 너비에도 영향을 줍니다. 스크립트의 맨 위에 다음 명령을 배치하여 전체 스크립트에 대해 설정합니다 Out-File:Width
.
$PSDefaultParameterValues['out-file:width'] = 2000
출력 너비를 늘리면 테이블 형식의 출력을 로깅할 때 메모리 사용량이 증가합니다. 파일에 테이블 형식 데이터를 많이 로깅하고 너비를 더 작게 설정할 수 있다는 것을 알고 있는 경우 더 작은 너비를 사용합니다.
출력과 같은 Get-Service
경우에 추가 너비를 사용하려면 출력을 파일로 출력하기 전에 파이프 Format-Table -AutoSize
해야 합니다.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
자세한 $PSDefaultParameterValues
내용은 about_Preference_Variables 참조하세요.
비교 연산자를 혼동할 수 있습니다.
연산자는 >
보다 큼 비교 연산자(종종 다른 프로그래밍 언어에서와 같이 >
표시됨)와 혼동하지 않습니다.
비교할 개체에 따라 36이 42보다 크지 않기 때문에 사용하는 >
출력이 올바른 것처럼 보일 수 있습니다.
PS> if (36 > 42) { "true" } else { "false" }
false
그러나 로컬 파일 시스템의 검사 호출 42
된 파일이 콘텐츠와 함께 작성된 것을 볼 수 있습니다36
.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
역방향 비교 <
(보다 작음)를 사용하려고 하면 시스템 오류가 발생합니다.
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
숫자 비교가 필요한 작업 -lt
인 -gt
경우 사용해야 합니다. 자세한 내용은 about_Comparison_Operators 연산자를 -gt
참조하세요.
참고 항목
PowerShell
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기