ฉันกำลังพยายามจำลองการทำงานของcat
คำสั่งใน Unix
ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ฉันอ่านทั้งสองไฟล์เป็นตัวแปรอย่างชัดเจนเชื่อมต่อตัวแปรเข้าด้วยกันแล้วเขียนตัวแปรที่ต่อกัน
ฉันกำลังพยายามจำลองการทำงานของcat
คำสั่งใน Unix
ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ฉันอ่านทั้งสองไฟล์เป็นตัวแปรอย่างชัดเจนเชื่อมต่อตัวแปรเข้าด้วยกันแล้วเขียนตัวแปรที่ต่อกัน
คำตอบ:
คุณสามารถใช้cat example1.txt, example2.txt | sc examples.txt
ไฟล์. คุณสามารถเชื่อมต่อไฟล์มากกว่าสองไฟล์ด้วยสไตล์นี้ได้เช่นกัน นอกจากนี้หากไฟล์มีชื่อคล้ายกันคุณสามารถใช้:
cat example*.txt | sc allexamples.txt
cat
เป็นนามแฝงสำหรับGet-Content
และเป็นนามแฝงสำหรับsc
Set-Content
หมายเหตุ 1 : โปรดใช้วิธีหลังอย่างระมัดระวัง - หากคุณพยายามส่งออกไปยังexamples.txt
(หรือคล้ายกันที่ตรงกับรูปแบบ) PowerShell จะเข้าสู่วงวนที่ไม่มีที่สิ้นสุด! (ฉันเพิ่งทดสอบสิ่งนี้)
หมายเหตุ 2 : การส่งออกไปยังไฟล์โดย>
ไม่สงวนการเข้ารหัสอักขระ! นี่คือเหตุผลที่แนะนำให้ใช้Set-Content
( sc
)
Set-Content
จะใช้หน้ารหัสประจำชาติ (เช่น Windows-1252 สำหรับภาษาอังกฤษ) หากไฟล์ที่มามีการเข้ารหัสอื่น ๆ (เช่นของ Windows 1251 หรือ UTF8) คุณต้องตั้งค่าที่ถูกต้องเข้ารหัสsc file.txt -Encoding UTF8
(ตัวเลขเช่น 1251 รัสเซียได้รับการสนับสนุนตั้งแต่ v6.2)
Add-Content
คือถ้าคุณรันคำสั่งสองครั้งไฟล์รวมจะยาวเป็นสองเท่า Out-File
ทดแทนที่ดีคือ ตัวอย่างที่นี่
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
จะไม่เปลี่ยนแปลงmy.bin
ยกเว้นการประทับเวลา -Raw
รักษาไบต์ CR / LF ในขณะที่-NoNewline
ป้องกันไม่ให้ PowerShell เพิ่มไบต์ CR / LF ของตัวเอง
ใน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
สวิตช์
คุณสามารถใช้Add-Content cmdlet อาจจะเร็วกว่าโซลูชันอื่นเล็กน้อยเนื่องจากฉันไม่ได้ดึงเนื้อหาของไฟล์แรก
gc .\file2.txt| Add-Content -Path .\file1.txt
gc
ดู?
gc
เป็นนามแฝงสำหรับ Get-Content
ในการต่อไฟล์ใน 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
หากคุณต้องการจัดลำดับไฟล์ตามพารามิเตอร์เฉพาะ (เช่นวันที่เวลา):
gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log
ฉันใช้:
Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log
-Encoding ASCII -Append
ต่อท้ายนี้ดี ฉันเพิ่มการเข้ารหัส ASCII เพื่อลบอักขระ nul ที่ Notepad ++ แสดงโดยไม่มีการเข้ารหัสอย่างชัดเจน
คุณสามารถทำสิ่งต่างๆเช่น:
get-content input_file1 > output_file
get-content input_file2 >> output_file
>
นามแฝงสำหรับ "out-file" อยู่ที่ไหนและ >> คือนามแฝงสำหรับ "out-file -append"
เนื่องจากการตอบกลับอื่น ๆ ส่วนใหญ่มักจะมีการจัดรูปแบบที่ไม่ถูกต้อง (เนื่องจากการวางท่อ) สิ่งที่ปลอดภัยที่สุดที่ควรทำมีดังนี้:
add-content $YourMasterFile -value (get-content $SomeAdditionalFile)
ฉันรู้ว่าคุณต้องการหลีกเลี่ยงการอ่านเนื้อหาของ $ SomeAdditionalFile ในตัวแปร แต่เพื่อบันทึกตัวอย่างเช่นการจัดรูปแบบบรรทัดใหม่ของคุณฉันไม่คิดว่าจะมีวิธีที่เหมาะสมที่จะทำได้โดยไม่ต้อง
วิธีแก้ปัญหาคือการวนซ้ำ $ SomeAdditionalFile ของคุณทีละบรรทัดและต่อท่อลงใน $ YourMasterFile ของคุณ อย่างไรก็ตามนี่เป็นทรัพยากรที่เข้มข้นเกินไป
ในการเข้ารหัสและลงท้ายบรรทัด:
Get-Content files.* -Raw | Set-Content newfile.file -NoNewline
หมายเหตุ: AFAIR ซึ่ง Powershells รุ่นเก่าไม่รองรับพารามิเตอร์ (<3? <4?)
ฉันคิดว่า "powershell way" อาจเป็น:
set-content destination.log -value (get-content c:\FileToAppend_*.log )