PowerShell에서 두 개의 텍스트 파일을 연결하는 방법은 무엇입니까?


108

catUnix 에서 명령 의 기능을 복제하려고합니다 .

두 파일을 모두 변수로 명시 적으로 읽고 변수를 함께 연결 한 다음 연결된 변수를 작성하는 솔루션을 피하고 싶습니다.

답변:


170

간단히 사용할 수 있습니다 cat example1.txt, example2.txt | sc examples.txt. 이 스타일로 두 개 이상의 파일을 확실히 연결할 수 있습니다. 또한 파일 이름이 비슷한 경우 다음을 사용할 수 있습니다.

cat example*.txt | sc allexamples.txt

cat별칭입니다 Get-Contentsc별칭입니다 Set-Content.

참고 1 : 후자의 방법에주의하십시오. 출력을 시도하면 examples.txt(또는 패턴과 일치하는 유사) PowerShell은 무한 루프에 빠집니다! (방금 테스트했습니다).

참고 2 :로 파일로 출력하면 >문자 인코딩이 유지되지 않습니다! 이것이 Set-Content( sc) 사용을 권장하는 이유 입니다.


5
누군가가 Get-ChildItems | Foreach-Object 구조는 Set-Content 대신 Add-Content를 사용할 수 있습니다. 그렇지 않으면 각 반복에서 대상 파일을 덮어 씁니다.
Jonas

1
기본적으로 Set-Content국가 코드 페이지를 사용합니다 (예 : 영어의 경우 Windows-1252). 소스 파일에 다른 코딩 (예 : Windows-1251 또는 UTF8)이 포함 된 경우 올바른 인코딩을 설정해야합니다 sc file.txt -Encoding UTF8(러시아어의 경우 1251과 같은 숫자는 v6.2부터 지원됨)
Radek Pech

@Jonas 문제 Add-Content는 명령을 두 번 실행하면 집계 파일의 길이가 두 배라는 것입니다. 좋은 대체는 Out-File입니다. 여기
Dan Friedman

1
파일이 바이너리이면 작동하지 않는 것 같습니다 (예 : 제 경우에는 zipfile의 일부).
Daniel Lidström

1
@ DanielLidström 올바른 매개 변수가있는 바이너리에서도 작동합니다 . 타임 스탬프를 제외하고는 Get-Content my.bin -Raw | Set-Content my.bin -NoNewline변경되지 않습니다 my.bin. -Raw모든 CR / LF 바이트를 보존하고 -NoNewlinePowerShell이 ​​자체 CR / LF 바이트를 추가하지 못하도록합니다.
Thomas

62

사용하지 마십시오 >. 문자 인코딩을 엉망으로 만듭니다. 사용하다:

Get-Content files.* | Set-Content newfile.file

cat의 별칭입니다 Get-Content.
n0rd

5
@ n0rd 나는 그것이 "대신 파이프 라인을 사용하는"일이라고 생각합니다.
ksoo

확인할 수 있습니다. 얻고 있었다 ÿþFF FE사용시 내 연결된 파일의 시작 부분에 >.
gpresland

16

에서는 cmd다음을 수행 할 수 있습니다.

copy one.txt+two.txt+three.txt four.txt

PowerShell에서는 다음과 같습니다.

cmd /c copy one.txt+two.txt+three.txt four.txt

PowerShell 방식은 gc 를 사용하는 것이지만 위의 방법은 특히 대용량 파일의 경우 매우 빠릅니다. 또한 스위치를 사용하여 ASCII 가 아닌 파일에서도 사용할 수 /B있습니다.


3
나에게 cat 명령은 cmd / c 명령 (정말 빠르게 실행 됨)보다 몇 배 더 오래 실행됩니다. 옵션을 알려 주셔서 감사합니다!
Rob

이것이 최고의 답변입니다.
Nicholas DiPiazza

12

Add-Content cmdlet을 사용할 수 있습니다 . 첫 번째 파일의 내용을 검색하지 않기 때문에 다른 솔루션보다 조금 더 빠를 수 있습니다.

gc .\file2.txt| Add-Content -Path .\file1.txt

무엇을 gc참조합니까?
octopusgrabbus

gcGet-Content
MM

8

명령 프롬프트에서 파일을 연결하려면

type file1.txt file2.txt file3.txt > files.txt

PowerShell은 type명령을 로 변환합니다. Get-Content즉, type명령에 Get-Content파일을 구분하는 쉼표가 필요 하기 때문에 PowerShell 에서 명령을 사용할 때 오류가 발생 합니다. PowerShell의 동일한 명령은 다음과 같습니다.

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

5

특정 매개 변수 (예 : 날짜 시간)로 파일을 주문해야하는 경우 :

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log

3

나는 사용했다 :

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append

이것은 잘 추가되었습니다. 명시 적 인코딩없이 메모장 ++에 표시되는 nul 문자를 제거하기 위해 ASCII 인코딩을 추가했습니다.


2

다음과 같이 할 수 있습니다.

get-content input_file1 > output_file
get-content input_file2 >> output_file

>"out-file"의 별칭은 어디에 있고 >>는 "out-file -append"의 별칭입니다.


2

대부분의 다른 회신은 종종 파이핑으로 인해 형식이 잘못되기 때문에 가장 안전한 방법은 다음과 같습니다.

add-content $YourMasterFile -value (get-content $SomeAdditionalFile)

나는 당신이 $ SomeAdditionalFile의 내용을 변수로 읽는 것을 피하고 싶었다는 것을 알고 있지만, 예를 들어 개행 형식을 저장하기 위해 나는 그것을 할 적절한 방법이 없다고 생각합니다.

해결 방법은 $ SomeAdditionalFile 줄을 한 줄씩 반복하고 $ YourMasterFile에 파이프하는 것입니다. 그러나 이것은 지나치게 리소스 집약적입니다.


1

인코딩 및 줄 끝을 유지하려면 :

Get-Content files.* -Raw | Set-Content newfile.file -NoNewline

참고 : AFAIR, 이전 Powershell에서 지원하지 않는 매개 변수 (<3? <4?)


0

"powershell 방식"은 다음과 같을 수 있습니다.

set-content destination.log -value (get-content c:\FileToAppend_*.log )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.