developer tip

PowerShell Set-Content 및 Out-File-차이점은 무엇입니까?

copycodes 2020. 10. 27. 08:20
반응형

PowerShell Set-Content 및 Out-File-차이점은 무엇입니까?


PowerShell에서의 차이 무엇 Out-FileSet-Content? 또는 Add-ContentOut-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일부 미리 정의 된 파라미터 설정.


글쎄, 나는 동의하지 않을 것이다 ... :)

  1. Out-File에는 콘텐츠를 추가 할 -Append (덮어 쓰기를 방지하기 위해 NoClober가 있음)가 있습니다. 그러나 이것은 같은 짐승이 아닙니다.
  2. 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.

참고URL : https://stackoverflow.com/questions/10655788/powershell-set-content-and-out-file-what-is-the-difference

반응형