PowerShell 파일에 쓰기: "Out-File"와 파일 출력 기법
Aug 26, 2025
기본적으로 PowerShell 출력은 콘솔로 전송되지만, 로깅, 보고, 자동화 또는 문제 해결을 위해 결과를 파일로 리디렉션할 수 있습니다. Out-File cmdlet은 인코딩, 줄 너비, 덮어쓰기 동작에 대해 완전한 제어를 제공하는 반면, 리디렉션 연산자(>, >>)는 간단한 작업에 더 빠릅니다. Set-Content, Add-Content 또는 Export-Csv/ConvertTo-Json 는 구조화된 데이터를 필요로 할 때 더 적합합니다. -Append , -NoClobber, Test-Path 및 오류 리디렉션(2>, 3>)을 사용해 로그를 안전하게 관리하세요.
PowerShell에서 출력하기 소개
PowerShell을 잘 아는 사람이라면 PowerShell 명령의 출력이 기본적으로 터미널에 표시된다는 것을 알고 있습니다. 하지만 경우에 따라 출력 내용을 파일로 리디렉션하거나 저장하고 싶을 수 있습니다.
- 명령이 실시간으로 처리하기 어려운 많은 양의 데이터를 반환할 수 있습니다. 필요에 따라 이 데이터를 리디렉션하거나 저장하면, 편한 시간에 처리하거나 검토할 수 있습니다.
- 다른 프로세스나 스크립트에서 명령의 결과를 사용하려면 PowerShell의 출력을 파일로 저장하는 명령을 사용해 출력 내용을 파일이나 변수에 저장하면 쉽게 다시 재사용할 수 있습니다.
- 예약된 작업이나 기타 자동화 작업은 보통 백그라운드에서 실행됩니다. 실시간으로 출력 내용을 확인하지 못할 수 있으므로 저장해 두면 나중에 검토할 수 있습니다.
- 때때로 출력 결과에 필요한 정보보다 더 많은 정보가 포함될 수 있습니다. 따라서 출력을 리다이렉트하거나 저장하여 필터링하고 형식에 맞게 정리할 수 있습니다.
- 원격 시스템에서 명령을 실행할 때는 실시간 출력 결과를 확인하기 위해 콘솔에 접근하지 못할 수 있습니다. 저장하거나 리다이렉트하면 원격 시스템에서 무슨 일이 발생했는지에 대한 기록을 남길 수 있습니다.
- 조직은 시스템 상태, 구성 또는 성능 지표를 기반으로 보고서를 생성합니다. PowerShell을 사용하면 시스템 데이터를 조회하고 보고서를 생성한 다음, 향후 검토를 위해 파일로 출력할 수 있습니다.
- PowerShell을 사용하면 자산 관리 및 컴플라이언스를 위해 하드웨어와 소프트웨어 재고 정보(인벤토리)를 수집할 수 있습니다. 이후 이 데이터를 파일로 출력하여 가시성을 높이고 관리 절차를 간소화할 수 있습니다.
- 작업을 자동화할 때는 수행한 조치와 그 결과를 추적하는 것이 필수적입니다. 출력을 파일로 리다이렉트하면 감사(auditing)를 위한 로그를 생성하는 데 도움이 됩니다.
- 스크립트가 실패하면 근본 원인을 파악해야 합니다. 출력을 저장해 두면 나중에 오류 처리, 디버깅 및 문제 해결을 위해 다시 검토할 수 있습니다.
요약하자면, PowerShell 출력의 리다이렉션 또는 저장은 생산성을 높이고 디버깅에 도움이 되며 유용한 로그를 제공하고, 특히 복잡한 워크플로우나 대규모 데이터셋을 다룰 때 자동화를 더 쉽게 해줍니다.
더 알아보고 싶은 PowerShell 콘텐츠:
PowerShell 결과를 파일로 출력하는 핵심 방법
Out-File Cmdlet
PowerShell에서 텍스트 파일로 쓰는 방법은 흔히 Out-File cmdlet을 사용하여 명령 결과(출력)를 파일에 직접 전송합니다. 가장 간단한 형태에서는 Out-File에 출력 내용을 쓸 경로와 파일 이름을 지정해야 합니다.
기본적으로 해당 경로에 동일한 이름의 파일이 이미 존재하면 cmdlet이 그 파일을 덮어쓰고, 존재하지 않으면 새 파일을 생성합니다.
Out-File 구문
다음은 Out-File cmdlet의 기본 구문입니다:
Out-File
[-FilePath] <cadena>
[[-Encoding] <Encoding>]
[-Append]
[-Force]
[-NoClobber]
[-Width <int>]
[-NoNewline]
[-InputObject <psobject>]
[-WhatIf]
[-Confirmar]
[<CommonParameters>]
매개변수
PowerShell의 Out-File cmdlet은 다음 매개변수를 허용합니다:
Parameter | Description |
|---|---|
|
-Filepath |
Sets the path and name of the output file |
|
-Encoding <Encoding> |
Sets the encoding for the output file. Options include ASCII, UTF8, UTF7, Unicode, etc. Default value is utf8NoBOM. |
|
-Append |
Adds output to the end of the file without overwriting existing content |
|
-Force |
Overrides read-only attribute and overwrites an existing read-only file. This parameter does not override security restrictions. |
|
-NoClobber |
Prevents overwriting an existing file. By default, if a file exists in the specified path, the Out-File cmdlet overwrites the file without warning. |
|
-Width |
Limits the number of characters on each line in the output file (default 80). Any additional characters are truncated, not wrapped. |
|
-NoNewLine |
Specifies that the content written to the output file does not end with a newline character. No spaces or newlines are inserted between the output strings and no newline is added after the last output string. |
|
-InputObject |
Specifies the objects to be written to the file. Type a command or expression that gets the objects or enter a variable that contains the objects. |
|
-WhatIf |
Runs the cmdlet in test mode to show the expected results of the cmdlet |
|
-Confirm |
Prompts for confirmation before running the cmdlet |
사용 사례
화면에 표시하는 대신 출력을 파일에 직접 기록하려면 PowerShell의 write output to file 방식을 사용하되, Out-File cmdlet을 PowerShell 명령 또는 변수에 덧붙여 사용하면 됩니다. 이 기법은 텍스트 문자열에 Out-File을 문자열에 바로 덧붙여 파일에 기록할 때도 동일하게 작동합니다.
PowerShell cmdlet에 Out-File 추가하기
실행 중인 프로세스 목록을 가져오고 PowerShell의 save output to file 방법을 사용하려면, 다음 예시처럼 C:\Temp 폴더에 “Processes”라는 이름의 텍스트 파일에 출력을 저장합니다:
Get-Process | Out-File -FilePath C:\Temp\processes.txt
여기서 Get-Process cmdlet은 실행 중인 모든 프로세스를 나열합니다. PowerShell의 파이프 출력 결과를 파일로 저장하는 기능을 사용하면, 명령 출력 내용을 즉시 텍스트 파일로 저장하여 나중에 분석할 수 있습니다.
텍스트 문자열에 Out-File 추가
예를 들어 C:\Temp 위치에 있는 “Test”라는 텍스트 파일에 “Hello, World!”를 추가하려면, PowerShell의 파일에 문자열을 쓰는(write string to file) 방법을 사용하여 다음 cmdlet을 실행합니다:
"Hello, World!" | Out-File -FilePath C:\Temp\Test.txt
파일이 없으면 생성됩니다. 파일이 이미 있으면 기본적으로 내용이 덮어써집니다.
변수에 Out-File 추가
변수와 함께 Out-File cmdlet을 사용할 수도 있습니다. 예를 들면:
$variable | Out-File -FilePath "C:\path\to\file.txt"
여기서 $variable은 파일로 보내려는 데이터(예: 텍스트 파일로 출력한 PowerShell 결과 또는 명령 출력)를 담고 있는 변수입니다.
리다이렉션 연산자(> 및 >>)
PowerShell의 리다이렉션 연산자(> 및 >>)는 Out-File cmdlet에 대한 간단하고 빠른 대안으로, 출력 내용을 파일로 리다이렉트할 수 있습니다.
- > 연산자는 추가 매개변수가 없는 Out-File cmdlet과 동일합니다. 파일이 있으면 덮어쓰고, 파일이 없으면 새로 생성합니다.
- >> 연산자는 Out-File -Append와 동일합니다. 파일이 있으면 출력 내용을 파일 끝에 추가하고, 파일이 없으면 새로 생성합니다.
이 연산자들은 오류 또는 자세한 출력 스트림을 리다이렉트하는 등 다른 용도도 있지만, 이는 이 문서의 범위를 벗어납니다.
기본 구문
연산자를 사용하는 기본 구문은 다음과 같습니다:
<Command> > <Path> # 덮어씀
<Command> >> <Path> # 추가함
리다이렉트 연산자는 어떤 매개변수도 사용하지 않는다는 점에 유의하세요.
예제 1 – > 연산자 사용
이 cmdlet은 Get-Process의 출력을 Processes.txt 파일에 기록하며, 대상 위치에 동일한 이름의 파일이 이미 있는 경우 기존 내용을 덮어씁니다.
Get-Process > C:\Temp\Processes.txt
예제 2 – >> 연산자 사용
이 cmdlet은 기존 콘텐츠를 덮어쓰지 않고 log.txt 파일의 끝에 현재 날짜와 시간을 추가합니다.
Get-Date >> C:\Temp\log.txt
지정한 경로에 log.txt라는 파일이 존재하지 않으면, 파일을 생성하고 현재 날짜와 시간을 해당 파일에 기록합니다.
Out-File Cmdlet vs 리디렉션 연산자 (> 및 >>)
Out-File cmdlet과 리디렉션 연산자 모두 PowerShell 출력을 파일에 작성하고(쓰기) 추가로 덧붙일 수 있습니다. 두 방식의 주요 차이점은 아래에서 설명합니다.
Feature | Out-File Cmdlet | Redirection Operators (> and >>) |
|---|---|---|
|
Parameters |
Accepts parameters |
Does not accept parameters |
|
Overwriting Behavior |
Default is overwrite; uses -Append for appending and -NoClobber to avoid overwriting |
> overwrites, >> appends No built-in control to prevent overwriting |
|
Encoding Control |
Allows specifying encoding with -Encoding |
Limited encoding control (UTF-8 in PowerShell 6+, Unicode in older versions) |
|
Width Control |
Supports setting line width with -Width |
No control over line width |
|
Error Handling |
Only successful results are exported, so warnings or errors are not written to the file |
Can specify which stream you want to export, like success, error, warning, etc. |
|
Usage in Scripts |
Best for scripts that require more control over output |
Quick and convenient for simple redirection |
각각을 언제 사용해야 하는가
비교해 보면 Out-File cmdlet은 더 다재다능하며 인코딩, 폭(Width), 덮어쓰기 제어 옵션을 제공하므로 복잡한 스크립트에 이상적입니다. 반면 리디렉션 연산자는 맞춤 구성이 필요 없는 빠른 출력 작업에 대해 빠르고 편리합니다. 다음은 각각을 언제 사용해야 하는지에 대한 간단한 안내입니다.
Out-File cmdlet을 사용해야 하는 경우
- 특정 인코딩이 필요한 경우(예: ASCII, UTF8, Unicode)
- 파일을 덮어쓰지 않기 위해(-NoClobber 사용)
- 출력의 줄 너비를 제어하려는 경우(-Width 사용)
- 다른 출력 제어 옵션을 유지하면서 추가(append) 모드로 동작
>와 >>를 언제 사용하는가
- 추가적인 서식이나 인코딩 없이 출력을 빠르게 리다이렉션하려는 경우
- 기존 파일을 덮어쓰기(>) 또는 추가(>>) 하려는 경우
초보자를 위한 Windows PowerShell 스크립팅 튜토리얼(PDF) (Beg인용)
고급 파일 출력 기법
덮어쓰기 관리
기본적으로 Out-File cmdlet은 지정된 경로에 동일한 이름의 파일이 이미 있으면 해당 파일을 덮어쓰고, 없으면 새 파일을 생성합니다.
기존 파일을 덮어쓰지 않으려면 PowerShell의 파일에 쓰기(추가) 메서드를 두 가지 방법 중 하나로 사용할 수 있습니다:
- 기존 파일에 출력 내용을 추가(추가 기록)하기
- 덮어쓰기를 방지하여, 기존 파일이 덮어써지지 않고 출력이 파일에 저장되지 않도록 합니다.
출력 추가
Out-File cmdlet에서 -Append 매개 변수를 사용하면, 지정한 파일의 기존 내용을 덮어쓰지 않고 새 출력을 파일 끝에 추가할 수 있습니다. 예를 들어 이전 데이터를 잃지 않으면서 이벤트를 점진적으로 기록하려는 경우에 특히 유용합니다.
이 명령은 System 로그에서 가장 최근 5개의 항목을 event_log.txt 파일에 추가합니다.
Get-EventLog -LogName System -Newest 5 | Out-File -FilePath C:\Temp\event_log.txt -Append
기존 파일에 출력을 추가하려면 리다이렉션 연산자 >>도 사용할 수 있습니다. 다음 예에서는 로컬 컴퓨터의 서비스 상태와 세부 정보가 log.txt 파일의 내용에 덧붙여집니다.
Get-Service >> C:\Temp\log.txt
덮어쓰기 방지
덮어쓰기를 방지하려면 Out-File cmdlet과 함께 -NoClobber 매개 변수를 사용하세요. 따라서 지정한 위치에 동일한 이름의 파일이 이미 있으면 PowerShell이 이를 덮어쓰지 않고 오류를 발생시킵니다. 이는 중요한 파일을 보호하는 데 도움이 됩니다.
다음 명령은 Temp 폴더에 log.txt라는 이름의 파일을 생성하려고 시도합니다. 하지만 이 이름의 파일이 이미 존재하는 경우 오류가 표시되고 출력이 파일로 저장되지 않습니다.
Get-Service | Out-File -FilePath C:\Temp\log.txt -NoClobber
강제 덮어쓰기
파일이 읽기 전용이라 PowerShell cmdlet의 출력으로 기존 파일의 내용을 덮어쓸 수 없는 경우가 있습니다. 이런 상황에서는 Out-File cmdlet과 함께 -Force 매개 변수를 사용하여 읽기 전용 파일을 덮어쓰세요.
이 cmdlet은 서비스 정보를 Services.txt 파일에 기록하며, Services.txt가 이미 존재하는 경우에도 파일이 읽기 전용이더라도 덮어쓰도록 보장합니다.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Force
출력 서식 및 인코딩
PowerShell의 Out-File cmdlet은 출력 서식과 인코딩을 사용자 지정할 수 있는 옵션을 제공합니다.
출력 형식 지정
Out-File cmdlet은 출력에 여러 열이 포함된 경우, 특히 예상대로 출력을 표시하지 못할 수 있습니다. 형식이 지정되고 읽기 쉬운 출력을 원하면 너비를 조정하거나 Format-Table cmdlet을 사용할 수 있습니다.
예제 1 – 너비 설정
Out-File과 함께 -Width 매개변수를 사용하여 출력 파일의 줄 너비를 지정하세요(기본값은 80자임).
이 cmdlet은 줄 너비를 200자로 설정하면서 서비스 정보를 Services.txt 파일에 씁니다. 이렇게 하면 줄바꿈 없이 더 넓은 출력이 가능합니다.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Width 200
예제 2 – Format-Table로 서식 지정
Out-File cmdlet으로 보내기 전에 Format-Table cmdlet을 사용하여 데이터를 구조화하세요.
이 cmdlet은 가독성을 위해 Format-Table -AutoSize를 사용하여 열 너비를 자동으로 조정합니다.
Get-Service | Format-Table -AutoSize | Out-File -FilePath C:\Temp\Services.txt
인코딩 설정
Out-File cmdlet을 사용할 때 PowerShell에서 출력의 인코딩을 지정하면, 데이터가 서로 다른 시스템과 애플리케이션에서 올바르게 해석되고 표시되며 호환됩니다.
-Encoding 매개변수는 파일에서 출력 텍스트가 어떤 방식으로 인코딩되는지 지정하는 데 도움이 됩니다. 일반적인 인코딩 유형은 다음과 같습니다:
- UTF8 – 웹 애플리케이션에서 흔히 사용되며 모든 문자를 지원합니다.
- ASCII – 기본적인 영어 문자로 제한되며, 용량은 작지만 제약이 있습니다.
- Unicode (UTF-16) – Windows 호환성에 적합하며 다양한 특수 문자, 기호, 국제 문자를 처리할 수 있지만 더 많은 공간을 사용합니다.
- Default – 시스템의 기본 인코딩을 사용하며, 환경에 따라 달라질 수 있고 플랫폼 간에 예측하기 어렵습니다.
예시 1 — UTF-8 인코딩 사용
출력 파일에 특수 문자가 포함되어 있거나 파일이 UTF-8이 표준 인코딩인 환경에서 사용될 예정이라면 UTF-8 인코딩을 사용하는 것이 좋습니다.
이 cmdlet은 시스템의 서비스 목록을 가져와 파일 인코딩을 UTF-8로 설정한 다음 해당 정보를 Services.txt 파일에 출력합니다.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding UTF8
예시 2 — ASCII 인코딩 사용
ASCII 인코딩은 더 간단한 텍스트 파일에 흔히 사용됩니다.
이 cmdlet은 시스템의 서비스 목록을 가져와 출력 결과를 Services.txt 파일로 파이프합니다. -Encoding 매개 변수는 출력을 ASCII 형식으로 변환하는 데 사용됩니다.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding ASCII
특정 출력 스트림 처리
Out-File cmdlet은 명령 또는 스크립트의 성공 결과를 파일에 씁니다. 하지만 오류, 경고 또는 특정 유형의 메시지는 파일에 쓰지 않습니다. 이는 리다이렉트 연산자를 사용하면 달성할 수 있으며, 어느 스트림을 파일로 출력할지 지정할 수 있습니다.
Operator | Description / Stream | Write cmdlet |
|---|---|---|
|
> |
Success only |
Write-Output |
|
2> |
Error only |
Write-Error |
|
3> |
Warning only |
Write-Warning |
|
4> |
Verbose only |
Write-Verbose |
|
5> |
Debug only |
Write-Debug |
|
6> |
Information only |
Write-Information |
|
*> |
All |
|
예시 1 — 오류 메시지를 파일로 전송
이 명령은 Readme라는 파일을 나열(ls)하려고 시도합니다. 경로를 지정하지 않으면 현재 디렉터리에서 해당 파일을 찾습니다. 파일이 존재하지 않으면 오류 메시지를 생성합니다. 2> 연산자는 이 오류를 error.log라는 파일로 리디렉션합니다. 그 결과 오류는 화면에 표시되지 않고 Temp 폴더의 error.log에 저장됩니다.
ls Readme 2> C:\Temp\error.log
엄선한 관련 콘텐츠:
예시 2 — 경고를 파일로 전송
PowerShell에서 경고 스트림은 스트림 번호 3입니다. 3>를 사용하면 경고를 파일로 리디렉션할 수 있습니다. 예시는 다음과 같습니다:
# 경고를 생성하는 명령
<Your-Command> 3> C:\Temp\warning_log.txt
출력을 위한 대체 방법
Set-Content 및 Add-Content Cmdlet
Set-Content 및 Add-Content cmdlet은 출력을 파일에 기록하는 또 다른 방법입니다.
- Set-Content는 제공된 새 콘텐츠로 파일의 기존 콘텐츠를 덮어씁니다. 파일이 없으면 생성합니다.
- Add-Content는 기존 파일 콘텐츠의 끝에 새 콘텐츠를 추가합니다. 파일이 없으면 생성하지만, 기존 콘텐츠를 교체하지는 않습니다.
Set-Content cmdlet
Set-Content cmdlet을 사용하여 파일의 콘텐츠를 새 콘텐츠로 작성하거나 교체합니다.
이 cmdlet은 Test.txt 파일에 있는 기존 콘텐츠를 덮어씁니다. -Value 매개 변수는 기존 콘텐츠를 대신할 콘텐츠 또는 텍스트를 지정합니다.
Set-Content -Path C:\Temp\Test.txt -Value "여기에 콘텐츠를 추가"
Add-Content cmdlet
Add-Content cmdlet을 사용하면 파일에 콘텐츠를 추가할 수 있으므로, 기존 파일을 덮어쓰지 않고 새 데이터를 해당 파일에 덧붙일 수 있습니다. Add-Content는 한 번에 여러 파일에 콘텐츠를 추가하는 데도 사용할 수 있습니다.
Out-File cmdlet과 리다이렉트(redirect) 연산자와 마찬가지로, 같은 이름의 파일이 존재하지 않으면 Add-Content cmdlet이 새 파일을 생성합니다.
예제 1 — 파일에 텍스트를 추가(추가/이어쓰기)
이 cmdlet은 Test.txt 파일에 새 텍스트를 추가합니다. -Value 매개 변수는 파일에 덧붙이려는 내용 또는 텍스트를 지정합니다.
Add-Content -Path C:\Temp\Test.txt -Value "추가할 새 줄"
파일이 읽기 전용이면 콘텐츠를 추가할 수 있도록 -Force 매개 변수를 사용해야 합니다.
예제 2 — 여러 파일에 텍스트 추가하기
여러 파일에 동일한 콘텐츠를 추가하려면 몇 가지 옵션이 있습니다.
- 업데이트할 파일을 지정하려면 경로에 와일드카드를 사용하세요
- 업데이트하지 않으려는 파일 이름은 제외하세요
이 cmdlet은 파일 이름에 test가 포함된 파일을 제외하고, Temp 폴더의 모든 .txt 파일에 현재 날짜를 추가합니다:
Add-Content -Path C:\Temp\files\*.txt -Value (Get-Date) -Exclude "test*"
예제 3 — 여러 줄의 텍스트 추가
이 명령은 Test.txt 파일에 여러 줄의 텍스트를 추가합니다.
$lines = @(
"Line 1: Details",
"Line 2: Specific Details"
)
Add-Content -Path C:\Temp\Test.txt -Value $lines
.NET 클래스
특히 대용량 데이터 처리를 포함하는 고급 시나리오에서는 .NET 클래스를 사용하여 파일에 출력을 생성할 수 있습니다. 이러한 클래스는 다음과 같습니다.
- BinaryWriter – 스트림에 기본 데이터 형식을 이진 형식으로 기록합니다.
- StreamWriter – 특정 인코딩으로 스트림에 문자를 쓰는 데 사용됩니다. 보통 텍스트 파일을 생성하거나 수정할 때 사용합니다.
- StringWriter – 문자열에 정보를 작성합니다. 이 클래스에서는 PowerShell이 문자열 정보를 StringBuilder 개체에 저장합니다.
C#에서 StreamWriter 클래스를 사용해 출력을 파일로 보내는 것은 간단합니다. 다음 예에서는 이를 사용하는 방법을 보여줍니다.
# Get the directories in C:\
$Dirs = Get-ChildItem -Path C:\ -Directory
# Open a stream writer
$File = 'C:\Temp\Dirs.txt'
$Stream = [System.IO.StreamWriter]::new($File)
# Write the folder names for these folders to the file
foreach($Dir in $Dirs) {
$Stream.WriteLine($Dir.FullName)
}
# Close the stream
$Stream.Close()
이 스크립트는 C:\ 드라이브에서 디렉터리를 나열하고 해당 경로를 텍스트 파일에 저장하기 위해 다음 단계를 수행합니다:
1단계:
$Dirs = Get-ChildItem -Path C:\ -Directory
이 줄은 -Directory 매개 변수를 사용하여 Get-ChildItem으로 C:\ 드라이브에 있는 디렉터리(파일이 아님)만 가져옵니다. 결과는 디렉터리 개체의 목록으로 $Dirs 변수에 저장됩니다.
2단계:
$File = 'C:\Temp\Dirs.txt'
$Stream = [System.IO.StreamWriter]::new($File)
이 줄들은 디렉터리 목록을 저장할 파일 경로(C:\Temp\Dirs.txt)를 설정한 다음, 해당 파일에 쓰기 위한 StreamWriter 개체를 초기화합니다. 이 개체는 $Stream에 할당됩니다.
3단계:
foreach($Dir in $Dirs) {
$Stream.WriteLine($Dir.FullName)
}
이 루프는 $Dirs에 있는 각 디렉터리 개체를 순회합니다. 각 디렉터리에 대해 $Stream.WriteLine을 사용하여 전체 경로($Dir.FullName)를 파일에 씁니다.
4단계:
$Stream.Close()
모든 디렉터리 경로를 작성한 후, 스크립트가 StreamWriter를 닫습니다.
Netwrix Directory Manager를 위한 1:1 데모를 예약하세요:
PowerShell 파일 출력 모범 사례
올바른 줄 너비를 설정하여 잘림을 방지하세요
PowerShell에서 -Width 매개변수로 올바른 줄 너비를 설정하면 긴 줄이 잘리지 않고, 파일 출력이 의도한 대로 형식화되도록 할 수 있습니다.
Out-File cmdlet의 -Width 매개변수는 출력에서 줄당 최대 문자 수를 제어합니다. 기본값은 80자이며, 이로 인해 더 긴 줄이 잘릴 수 있습니다. 예를 들어 아래와 같이 너비를 200자로 늘릴 수 있습니다:
Get-Process | Out-File -FilePath "output.txt" -Width 200
다음 사항을 참고하세요:
- 불필요한 공백이나 잘림(truncation)을 방지하려면 가장 긴 줄에 맞게 -Width를 설정하세요. 대부분의 출력에서는 120–200자 정도의 너비가 잘 작동합니다.
- 열이 많은 데이터(예: CSV 파일)라면 전체 줄을 담을 수 있도록 더 큰 너비를 설정하세요.
- 파이프라인에서는 Out-String -Width를 사용해 줄 너비를 제어하세요. Out-File로 전달하기 전에 전체 줄이 지정된 너비 안에 들어가도록 확인합니다.
올바른 인코딩을 설정하세요
PowerShell이 사용하는 기본 인코딩은 사용 중인 cmdlet과 PowerShell 버전에 따라 달라집니다. 다음 표는 사용되는 기본 인코딩을 보여줍니다:
Cmdlet / Operator | PowerShell 5.1 (and earlier) Default Encoding | PowerShell Core / PowerShell 7+ Default Encoding |
|---|---|---|
|
Out-File, Set-Content, Add-Content |
UTF-16LE (Unicode) |
UTF-8 (No BOM) |
|
>, >> (Redirection) |
ASCII |
UTF-8 (No BOM) |
교차 시스템 호환성을 위해 UTF-8 인코딩을 권장합니다. 다만 레거시 시스템의 경우 -Encoding ASCII 또는 -Encoding Unicode를 지정하는 것이 좋을 수 있습니다.
스크립트 전반에 걸쳐 기본값을 설정하려면 $PSDefaultParameterValues를 사용하세요
PowerShell의 $PSDefaultParameterValues를 사용하면 스크립트와 세션 전반에 걸쳐 매개변수의 기본값을 설정할 수 있습니다. 옵션을 반복해서 지정하지 않고도 일관성을 강제하는 방법을 제공합니다.
Out-File에 대해 UTF8 인코딩과 더 넓은 폭을 사용하도록 전역 기본값을 설정하는 방법은 다음과 같습니다.
$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
$PSDefaultParameterValues["Out-File:Width"] = 200
Out-File을 Format-Table 및 Format-List와 함께 사용해 더 잘 구조화된 출력 만들기
Out-File cmdlet을 Format-Table 또는 Format-List와 함께 사용하면, 구조가 잘 잡히고 읽기 쉬운 텍스트 출력 파일을 만들 수 있습니다.
Format-Table
Format-Table은 행과 열의 구조가 명확한 데이터에 가장 적합합니다. 보기 좋고 읽기 쉬운 표 형태로 정리된 형식을 생성합니다. 다만 Out-File cmdlet과 함께 사용하려면 다음 사항을 고려하세요:
- 필요한 열만 지정하려면 -Property 매개 변수를 사용하세요. 이렇게 하면 출력 파일이 불필요한 내용으로 어수선해지는 것을 방지할 수 있습니다.
- 콘텐츠에 맞게 열 너비를 최적화하려면 -AutoSize 매개 변수를 사용하세요. 그러면 불필요한 여백이 줄어들거나 내용이 잘리는 현상(절단)이 감소합니다.
- 잘림(절단)을 방지하고 출력이 정렬된 상태를 유지하려면 -Width 매개 변수를 사용하세요.
예시는 다음과 같습니다:
Get-Process | Format-Table -Property Name, ID, CPU, WS -AutoSize | Out-File -FilePath "ProcessList.txt" -Width 200
Format-List
Format-List는 데이터를 세로로 표시하며, 한 줄에 하나의 속성이 들어갑니다. 속성이 많거나 값이 긴 필드가 있는 경우 이러한 값이 잘리지 않도록 하려면 이 형식을 사용하세요. 이 형식은 보고서와 상세 로그에 적합합니다.
다음은 Out-File과 함께 Format-List를 사용하는 예입니다:
Get-Process | Format-List -Property Name, ID, CPU, StartTime | Out-File -FilePath "DetailedProcessList.txt"
Format-Table과 마찬가지로 필요한 속성만 선택하세요.
Test-Path로 파일이 있는지 확인한 후 작성하여 파일 충돌을 방지하세요
파일에 쓰기를 시도하기 전에 해당 파일이 존재하는지 확인하는 것은 항상 현명한 방법입니다. 이렇게 하면 실수로 덮어쓰는 일을 피하고, 이미 파일이 존재할 때 어떻게 처리할지 결정할 수 있습니다. PowerShell의 Test-Path cmdlet을 사용하면 파일의 존재 여부를 확인할 수 있습니다.
다음은 따라야 할 단계입니다:
- 파일 경로를 변수에 할당합니다.
- Test-Path cmdlet을 사용하여 파일이 존재하는지 확인합니다.
- 추가(append), 덮어쓰기(overwrite), 이름 바꾸기(rename), 또는 쓰기를 건너뛸지 여부를 결정하세요.
- Out-File cmdlet을 사용하여 파일을 생성하거나 파일에 씁니다.
자주 발생하는 실수와 해결 방법
PowerShell의 Out-File cmdlet은 때때로 일반적인 문제를 일으킬 수 있으며, 특히 파일 처리, 인코딩, 콘텐츠 추가(append)와 관련해 문제가 발생할 수 있습니다. 아래에서는 몇 가지 일반적인 이슈와 그 해결 방법을 설명합니다.
덮어쓰기로 인한 데이터 손실을 방지하세요
기본적으로 Out-File cmdlet은 동일한 이름의 파일이 이미 존재하는 경우 경고 없이 기존 파일의 내용을 덮어씁니다. 이를 방지하는 방법은 다음과 같습니다:
- -Append 매개변수를 사용해 기존 파일을 덮어쓰지 말고, 출력 내용을 기존 파일에 추가하세요.
- Test-Path로 파일이 존재하는지 확인한 다음, Out-File을 어떻게 진행할지 결정하세요.
부적절한 인코딩으로 인한 데이터 손실을 방지하세요
기본적으로 Out-File은 PowerShell 5.1 및 이전 버전에서는 Unicode 인코딩을 사용합니다. PowerShell Core 및 이후 버전에서는 UTF-8 인코딩을 사용합니다.
기본 인코딩은 시스템이나 다른 인코딩을 기대하는 애플리케이션과 호환되지 않을 수 있습니다. 따라서 -Encoding 매개 변수를 사용하여 인코딩을 명시적으로 지정해야 합니다.
성능을 보장하기 위해 장시간 실행되는 스크립트에서 출력(출력 결과)을 관리하세요
PowerShell ISE와 같이 리소스가 제한된 환경에서는 Out-File cmdlet을 사용해 스크립트를 실행할 경우 다음과 같은 문제가 발생할 수 있습니다:
- 복잡한 데이터 구조를 예상대로 처리하지 못함
- 긴 출력이 잘려서 나타남
긴 출력은 다음과 같이 처리할 수 있습니다:
- 적절한 너비를 설정하려면 -Width 파라미터를 사용하세요
- Export-Csv 또는 ConvertTo-Json cmdlet을 사용해 복잡한 데이터를 CSV나 JSON 같은 구조화된 형식으로 내보낼 수 있습니다
PowerShell 스크립트에서 로깅 및 오류 처리를 처리하세요
때때로 파일이 사용 중이거나 다른 프로세스에 의해 잠겨 있을 수 있습니다. 이 경우 Out-File cmdlet은 쓸 수 없기 때문에 오류를 발생시킵니다. try/catch 블록으로 이와 기타 오류를 처리할 수 있습니다. 예시는 다음과 같습니다:
$content = "Write content to file"
$filePath = "C:\Temp\Errors.txt"
try {
$content | Out-File -FilePath $filePath
Write-Host "File written successfully."
} catch {
Write-Host "File is in use or locked by another process."
}
FAQ
공유하기
더 알아보기
저자 소개
Tyler Reese
제품 관리 부사장, CISSP
소프트웨어 보안 업계에서 20년이 넘는 경력을 쌓아온 Tyler Reese는 오늘날 기업이 직면한 빠르게 변화하는 아이덴티티 및 보안 과제에 대해 깊이 잘 알고 있습니다. 현재 그는 Netwrix Identity and Access Management 포트폴리오의 제품 디렉터로 재직 중이며, 시장 동향을 평가하고 IAM 제품 라인의 방향을 설정하는 일을 포함해 궁극적으로는 엔드 유저의 요구를 충족하는 역할을 담당하고 있습니다. 그의 전문 경력은 Fortune 500 기업을 대상으로 한 IAM 컨설팅부터 대형 D2C(Direct-to-Consumer) 기업의 엔터프라이즈 아키텍트로 일한 경험까지 폭넓게 이어져 있습니다. 그는 현재 CISSP 자격증을 보유하고 있습니다.