PowerShell에서의 차이 무엇 Out-File
과 Set-Content
? 또는 Add-Content
와 Out-File -append
?
동일한 파일에 대해 둘 다 사용하면 텍스트가 완전히 mojibaked 됩니다.
(사소한 두 번째 질문 : >
의 별칭 Out-File
입니까?)
답변
다음은 몇 달 동안 PowerShell을 사용한 경험과 과학적 실험을 통해 제가 추론 한 내용을 요약 한 것입니다. 나는 문서에서 이것을 발견하지 못했습니다.
[ 업데이트 : 이 문서의 대부분이 더 잘 문서화되었습니다.]
읽기 및 쓰기 잠금
Out-File
이 실행되는 동안 다른 응용 프로그램이 로그 파일을 읽을 수 있습니다.
Set-Content
실행 중에는 다른 응용 프로그램이 로그 파일을 읽을 수 없습니다. 따라서 장기 실행 명령을 기록하는 데 절대 사용하지 마십시오Set-Content
.
부호화
Out-File
기본적으로 Unicode
( UTF-16LE
) 인코딩으로 저장 되지만 (지정 될 수 있음 ) PowerShell 3+ 에서는 Set-Content
기본값이 ASCII
( US-ASCII
)로 지정됩니다 (지정 될 수도 있음). 이전 PowerShell 버전에서는 (ANSI) 인코딩으로 Set-Content
콘텐츠를 작성했습니다 Default
.
편집자 주 : 버전 5.1의 PowerShell 은 문서에서 주장하는 내용에도 불구하고 여전히 문화 별 Default
( “ANSI”) 인코딩으로 기본 설정됩니다 . ASCII가 기본값 인 경우와 같은 비 ASCII 문자 ü
는 literal 로 변환 ?
되지만 그렇지 않은 경우 : 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
yields $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
즉, 두 명령의 기본값은 호환되지 않으며 혼합하면 텍스트가 손상되므로 항상 인코딩을 지정하십시오.
서식
Bartek이 설명했듯이 Out-File
터미널에서 볼 수 있듯이 출력의 멋진 형식을 저장합니다. 따라서 두 개의 파일이있는 폴더에서 명령 dir | out-file out.txt
은 11 줄의 파일을 만듭니다.
반면 Set-Content
에 더 간단한 표현을 저장합니다. 두 개의 파일이있는 폴더에서 명령 dir | set-content sc.txt
은 두 줄의 파일을 만듭니다. 터미널에서 출력을 에뮬레이트하려면 :
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
이 서식이 줄 바꿈에 영향을 미친다고 생각하지만 아직 설명 할 수 없습니다.
파일 생성
Set-Content
다음과 같은 경우 빈 파일을 안정적으로 생성하지 않습니다 Out-File
.
빈 폴더에서이 명령 dir | out-file out.txt
은 파일을 생성하지만 생성 dir | set-content sc.txt
하지 않습니다.
파이프 라인 변수
Set-Content
파이프 라인에서 파일 이름을 가져옵니다. 여러 파일의 내용을 고정 값으로 설정할 수 있습니다.
Out-File
파이프 라인에서 데이터를 가져옵니다. 단일 파일의 콘텐츠를 업데이트합니다.
매개 변수
Set-Content
다음과 같은 추가 매개 변수가 포함됩니다.
- 들어오지 못하게 하다
- 필터
- 포함
- PassThru
- 흐름
- UseTransaction
Out-File
다음과 같은 추가 매개 변수가 포함됩니다.
- 추가
- 아니요
- 폭
이러한 매개 변수에 대한 자세한 내용은 도움말을 참조하십시오. 예 : get-help out-file -parameter append
.
답변
Out-File
-NoClobber
및 / 또는 -Append
플래그가 설정 되지 않은 경우 출력 경로를 덮어 쓰는 동작이 있습니다. Add-Content
출력 경로가 기본적으로 이미 존재하는 경우 콘텐츠를 추가합니다 (가능한 경우). 둘 다 파일이 아직 없으면 생성합니다.
또 다른 흥미로운 차이점은 Add-Content
기본적으로 ASCII 인코딩 파일을 Out-File
생성하고 기본적으로 리틀 엔디안 유니 코드 인코딩 파일을 생성한다는 것입니다.
>
에 대한 별칭 구문 설탕입니다 Out-File
. 그것은의 Out-File
일부 미리 정의 된 파라미터 설정.
답변
글쎄, 나는 동의하지 않을 것이다 … 🙂
- Out-File에는 콘텐츠를 추가 할 -Append (덮어 쓰기를 방지하기 위해 NoClober가 있음)가 있습니다. 그러나 이것은 같은 짐승이 아닙니다.
- 명령 | Add-Content는 입력시 .ToString () 메서드를 사용합니다. Out-File은 기본 형식을 사용합니다.
그래서:
ls | Add-Content test.txt
과
ls | Out-File test.txt
완전히 다른 결과를 얻을 수 있습니다.
그리고 아니요, ‘>’는 별칭이 아니라 리디렉션 연산자입니다 (다른 셸에서와 동일). 그리고 매우 심각한 제한이 있습니다. 표시되는 것과 같은 방식으로 선을 절단합니다. Out-File에는이를 방지하는 데 도움이되는 -Width 매개 변수가 있습니다. 또한 리디렉션 연산자를 사용하면 사용할 인코딩을 결정할 수 없습니다.
HTH Bartek
답변
Set-Content
는 지원 -Encoding Byte
하지만 지원 Out-File
하지 않습니다.
따라서 바이너리 데이터 나 그 결과를 Text.Encoding#GetBytes()
파일 에 쓰려면 Set-Content
.
답변
Out-file -append 또는 “>>”는 실제로 동일한 파일에서 두 개의 인코딩을 혼합 할 수 있습니다. 파일이 원래 ascii 또는 ansi 인 경우에도 기본적으로 맨 아래에 유니 코드를 추가합니다. Add-content는 추가하기 전에 인코딩을 확인하고 일치시킵니다. Btw, export-csv의 기본값은 ascii (악센트 없음)이고 set-content / add-content는 ansi입니다.
답변
인코딩 차이에 대해 추가하고 싶음 :
PowerShell 5.1이 설치된 Windows :
- Out-File-기본 인코딩은 utf-16le입니다.
- Set-Content-기본 인코딩은 us-ascii입니다.
PowerShell 7.1을 사용하는 Linux :
- Out-File-기본 인코딩은 us-ascii입니다.
- Set-Content-기본 인코딩은 us-ascii입니다.