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.ps1script.log된 파일로 보냅니다.

.\script.ps1 *> script.log

예제 5: 모든 쓰기 호스트 및 정보 스트림 데이터 표시 안 함

다음은 모든 정보 스트림 데이터를 표시하지 않는 예제입니다. 정보 스트림 cmdlet에 대한 자세한 내용은 Write-HostWrite-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으로 리디렉션할 때 바이트 스트림 데이터를 지원하지 않습니다. stderrstdout 스트림을 결합하면 결합된 스트림이 문자열 데이터로 처리됩니다.

주의

데이터를 추가하지 않는 리디렉션 연산자(>n>)는 지정된 파일의 현재 내용을 경고 없이 덮어씁니다.

그러나 파일이 읽기 전용, 숨겨진 파일 또는 시스템 파일인 경우 리디렉션 이 실패합니다. 추가 리디렉션 연산자(>>n>>)는 읽기 전용 파일에 쓰지 않지만 시스템 또는 숨겨진 파일에 콘텐츠를 추가합니다.

콘텐츠를 읽기 전용, 숨겨진 또는 시스템 파일로 강제로 리디렉션하려면 해당 매개 변수와 함께 cmdlet을 Out-FileForce 사용합니다.

파일에 쓸 때 리디렉션 연산자는 인코딩을 사용합니다 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 참조하세요.

참고 항목