ฉันจะเชื่อมต่อไฟล์ข้อความสองไฟล์ใน PowerShell ได้อย่างไร


108

ฉันกำลังพยายามจำลองการทำงานของcatคำสั่งใน Unix

ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ฉันอ่านทั้งสองไฟล์เป็นตัวแปรอย่างชัดเจนเชื่อมต่อตัวแปรเข้าด้วยกันแล้วเขียนตัวแปรที่ต่อกัน

คำตอบ:


170

คุณสามารถใช้cat example1.txt, example2.txt | sc examples.txtไฟล์. คุณสามารถเชื่อมต่อไฟล์มากกว่าสองไฟล์ด้วยสไตล์นี้ได้เช่นกัน นอกจากนี้หากไฟล์มีชื่อคล้ายกันคุณสามารถใช้:

cat example*.txt | sc allexamples.txt

catเป็นนามแฝงสำหรับGet-Contentและเป็นนามแฝงสำหรับscSet-Content

หมายเหตุ 1 : โปรดใช้วิธีหลังอย่างระมัดระวัง - หากคุณพยายามส่งออกไปยังexamples.txt(หรือคล้ายกันที่ตรงกับรูปแบบ) PowerShell จะเข้าสู่วงวนที่ไม่มีที่สิ้นสุด! (ฉันเพิ่งทดสอบสิ่งนี้)

หมายเหตุ 2 : การส่งออกไปยังไฟล์โดย>ไม่สงวนการเข้ารหัสอักขระ! นี่คือเหตุผลที่แนะนำให้ใช้Set-Content( sc)


5
ในกรณีที่มีคนต้องการทำซ้ำไฟล์ด้วยGet-ChildItems | โครงสร้าง Foreach-Objectคุณอาจต้องการใช้ Add-Content แทน Set-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 ในขณะที่-NoNewlineป้องกันไม่ให้ PowerShell เพิ่มไบต์ CR / LF ของตัวเอง
Thomas

62

ห้ามใช้>; มันทำให้การเข้ารหัสอักขระยุ่งเหยิง ใช้:

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

catGet-Contentเป็นนามแฝงสำหรับ
1

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

gcเป็นนามแฝงสำหรับ Get-Content
MM

8

ในการต่อไฟล์ใน command prompt มันจะเป็น

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

PowerShell จะแปลงtypeคำสั่งเป็นGet-Contentซึ่งหมายความว่าคุณจะได้รับข้อผิดพลาดเมื่อใช้typeคำสั่งใน PowerShell เนื่องจากGet-Contentคำสั่งต้องการเครื่องหมายจุลภาคแยกไฟล์ คำสั่งเดียวกันใน 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

ต่อท้ายนี้ดี ฉันเพิ่มการเข้ารหัส ASCII เพื่อลบอักขระ nul ที่ Notepad ++ แสดงโดยไม่มีการเข้ารหัสอย่างชัดเจน


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 ซึ่ง Powershells รุ่นเก่าไม่รองรับพารามิเตอร์ (<3? <4?)


0

ฉันคิดว่า "powershell way" อาจเป็น:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.