파워셸(PowerShell)에서 명령 출력을 > 로 파일에 저장했는데, 그 파일(tar.gz 압축본, 이미지, 실행파일 같은 바이너리)이 열리지 않고 깨질 때 원인을 확인하고 해결하는 방법입니다.
1. 문제: > 로 저장한 압축 파일이 열리지 않는다
원격 서버를 통째로 백업하려고, SSH로 원격에서 tar로 묶어 gzip으로 압축한 스트림을 로컬 파일로 받았습니다. 명령은 에러 없이 끝났는데, 만들어진 tar.gz가 "not in gzip format"이라며 풀리지 않았습니다. 파일 크기를 보니 원본으로 예상한 것보다 1.5~2배 컸습니다. 같은 방식으로 텍스트 로그를 저장했을 때는 멀쩡했는데, 압축본이나 이미지 같은 바이너리만 깨졌습니다.
- SSH로 받은 tar.gz가 "not in gzip format"으로 안 풀림
- 파일 크기가 원본보다 1.5~2배 큼
- 텍스트는 멀쩡한데 바이너리(압축, 이미지, exe)만 깨짐
2. 원인: PowerShell의 > 는 "텍스트" 리다이렉트다
파워셸의 > 는 Out-File의 축약입니다. 즉 들어온 바이트 스트림을 그냥 흘려보내는 게 아니라, 일단 문자로 디코드한 뒤 다시 인코딩해서 파일에 씁니다. Windows PowerShell 5.1의 기본 인코딩은 UTF-16LE(+BOM)라서, 파일 맨 앞에 BOM 2바이트(FF FE)가 붙고, 모든 바이트가 2바이트 단위로 부풀며(그래서 크기가 커짐), 바이트와 문자를 오가는 변환 과정에서 원본이 손상됩니다. 텍스트는 우연히 살아 보일 뿐, 바이너리에는 치명적입니다.
- > 는 Out-File 축약이라 "텍스트 전용" 경로
- 출력을 문자로 디코드 후 UTF-16LE로 재인코딩 + 맨 앞 BOM 추가
- 바이트가 부풀고(크기 증가) 변환 과정에서 손상됨
3. 확인: 파일 앞부분(매직 바이트)으로 진단한다
정상 gzip 파일은 첫 두 바이트가 1F 8B(gzip 매직 넘버)입니다. 깨진 파일은 이 자리가 FF FE(UTF-16 BOM)로 시작하고, 그 뒤로 바이트마다 00이 끼어 있습니다. Format-Hex로 앞부분만 찍어 보면 바로 구분됩니다.

- 정상 gzip: 1F 8B 08 ...
- 깨진 파일: FF FE 1F 00 8B 00 ... (UTF-16 BOM + 바이트마다 00)
- 첫 두 바이트만 봐도 재인코딩으로 깨졌는지 판별 가능
4. 해결: 바이트를 그대로 저장한다
근본 원인이 "텍스트 재인코딩"이니, 저장 경로에서 그 변환을 안 거치게 하면 됩니다. 가장 간단한 건 cmd의 리다이렉트를 쓰는 것입니다. cmd의 > 는 바이트를 그대로 흘려보내기 때문에 파워셸 안에서 cmd /c로 감싸기만 해도 해결됩니다. 아니면 파일 저장 자체를 전송 도구(scp 등)에 맡겨서, 파워셸의 리다이렉트를 아예 안 타게 하는 방법도 확실합니다.

- 해결 1: cmd /c로 감싸 cmd의 리다이렉트 사용(바이트 패스스루)
- 해결 2: scp 등 도구가 파일을 직접 쓰게 함(재인코딩 경로 회피)
- 파이프로 받은 시점엔 이미 문자로 변환된 뒤라, 굳이 파워셸로 받으려면 .NET Process의 표준출력 BaseStream을 바이트로 직접 읽어야 함
5. 정리
파워셸에서 > 로 저장한 바이너리가 깨지는 건 버그가 아니라, > 가 텍스트 리다이렉트라서 출력을 UTF-16으로 재인코딩하기 때문입니다. 첫 두 바이트가 FF FE로 시작하면 이 함정에 걸린 것이고, cmd의 리다이렉트를 쓰거나 저장을 도구에 맡기면 바이트가 그대로 보존됩니다. 로그 같은 텍스트만 다룰 때는 잘 안 드러나다가, 백업이나 이미지처럼 바이너리를 저장하는 순간 터지는 함정이라 알아두면 한 번에 잡습니다.
- 바이너리가 깨지고 크기가 커짐 -> PowerShell > 의 텍스트 재인코딩이 원인
- 첫 두 바이트 FF FE(UTF-16 BOM)면 확정
- cmd /c 리다이렉트나 도구 직접 저장으로 바이트 보존
함께 보면 좋은 글:
- 파이썬에서 윈도우 토스트 알림 띄우기 (설치 없이 PowerShell, 한글 깨짐 해결) - 같은 파워셸 인코딩 함정 편
- 윈도우 터미널에서 특수문자가 겹쳐 보일 때 (유니코드 모호폭) - 표시 쪽 인코딩 함정 편
여기까지 PowerShell에서 > 로 저장한 바이너리 파일이 깨지는 문제의 원인과 해결 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!
'일상' 카테고리의 다른 글
| 안 쓰는 AWS 인프라를 완전히 내려 요금 0원으로 만들기 (삭제 순서와 숨은 과금 함정) (0) | 2026.07.17 |
|---|---|
| 스캔한 서명을 배경 투명 PNG로 뽑기 (Python, PIL + numpy) (0) | 2026.07.17 |
| 규칙 기반 관제에 경량 ML 이상탐지 얹기 (LLM 없이, 내부에서) (0) | 2026.07.10 |
| 여러 서버 배치를 감시하는 관제 대시보드 직접 만들기 (설계 포인트) (0) | 2026.07.10 |
| 로그에서 원하는 것만 뽑는 grep 패턴 (배치·에러 추적 실전) (0) | 2026.07.10 |