[powershell] 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 다음과 같은 추가 매개 변수가 포함됩니다.

  • 들어오지 못하게 하다
  • 필터
  • 포함
  • 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일부 미리 정의 된 파라미터 설정.


답변

글쎄, 나는 동의하지 않을 것이다 … 🙂

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


답변