PowerShell Set-Content 및 Out-File-차이점은 무엇입니까?
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
다음과 같은 추가 매개 변수가 포함됩니다.
- 들어오지 못하게 하다
- 필터
- 포함
- 패스 스루
- 흐름
- 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가 있음)가 있습니다. 그러나 이것은 같은 짐승이 아닙니다.
- command | Add-Content will use .ToString() method on input. Out-File will use default formatting.
so:
ls | Add-Content test.txt
and
ls | Out-File test.txt
will give you totally different results.
And no, '>' is not alias, it's redirection operator (same as in other shells). And has very serious limitation... It will cut lines same way they are displayed. Out-File has -Width parameter that helps you avoid this. Also, with redirection operators you can't decide what encoding to use.
HTH Bartek
Set-Content
supports -Encoding Byte
, while Out-File
does not.
So when you want to write binary data or result of Text.Encoding#GetBytes()
to a file, you should use Set-Content
.
Out-file -append or ">>" can actually mix two encodings in the same file. Even if the file is originally ascii or ansi, it will add unicode by default to the bottom of it. Add-content will check the encoding and match it before appending. Btw, export-csv defaults to ascii (no accents), and set-content/add-content to ansi.
'developer tip' 카테고리의 다른 글
정적 const int에 대한 정의되지 않은 참조 (0) | 2020.10.27 |
---|---|
STA 스레드를 실행하는 작업 (TPL)을 만드는 방법은 무엇입니까? (0) | 2020.10.27 |
JLabel의 여러 줄 텍스트 (0) | 2020.10.27 |
jQuery 찾기 및 문자열 바꾸기 (0) | 2020.10.26 |
Xcode의 빌드 구성에 따라 조건부로 파일을 포함하려면 어떻게해야합니까? (0) | 2020.10.26 |