ฉันกำลังพยายามจำลองการทำงานของcatคำสั่งใน Unix
ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ฉันอ่านทั้งสองไฟล์เป็นตัวแปรอย่างชัดเจนเชื่อมต่อตัวแปรเข้าด้วยกันแล้วเขียนตัวแปรที่ต่อกัน
ฉันกำลังพยายามจำลองการทำงานของcatคำสั่งใน Unix
ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ฉันอ่านทั้งสองไฟล์เป็นตัวแปรอย่างชัดเจนเชื่อมต่อตัวแปรเข้าด้วยกันแล้วเขียนตัวแปรที่ต่อกัน
คำตอบ:
คุณสามารถใช้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)
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 )