Làm cách nào để nối hai tệp văn bản trong PowerShell?


108

Tôi đang cố gắng sao chép chức năng của catlệnh trong Unix.

Tôi muốn tránh các giải pháp trong đó tôi đọc rõ ràng cả hai tệp thành các biến, nối các biến với nhau và sau đó viết ra biến được nối.

Câu trả lời:


170

Bạn có thể đơn giản sử dụng cat example1.txt, example2.txt | sc examples.txt. Bạn chắc chắn cũng có thể nối nhiều hơn hai tệp với kiểu này. Ngoài ra, nếu các tệp được đặt tên giống nhau, bạn có thể sử dụng:

cat example*.txt | sc allexamples.txt

catmột bí danh cho Get-Content, và sclà một bí danh cho Set-Content.

Lưu ý 1 : Hãy cẩn thận với phương pháp sau - nếu bạn cố gắng xuất ra examples.txt(hoặc tương tự phù hợp với mẫu), PowerShell sẽ mắc vào một vòng lặp vô hạn! (Tôi vừa thử nghiệm cái này).

Lưu ý 2 : Xuất ra tệp >không bảo toàn mã hóa ký tự! Đây là lý do tại sao sử dụng Set-Content( sc) được khuyến khích.


5
Đề phòng trường hợp ai đó muốn lặp lại các tệp với Get-ChildItems | Cấu trúc Foreach-Object mà bạn có thể muốn sử dụng Add-Content thay vì Set-Content. Nếu không, tệp đích sẽ bị ghi đè trong mỗi lần lặp.
Jonas

1
Lưu ý rằng theo mặc định Set-Contentsử dụng trang mã quốc gia (ví dụ: Windows-1252 cho tiếng Anh). Nếu các tệp nguồn chứa mã hóa khác (ví dụ: Windows-1251 hoặc UTF8), bạn phải đặt mã hóa chính xác sc file.txt -Encoding UTF8(các số như 1251 cho tiếng Nga được hỗ trợ kể từ v6.2)
Radek Pech

@Jonas Vấn đề Add-Contentlà nếu bạn chạy lệnh hai lần, tệp tổng hợp sẽ dài gấp đôi. Một sự thay thế tốt là Out-File. Ví dụ ở đây
Dan Friedman

1
Dường như không hoạt động nếu các tệp là nhị phân (ví dụ: các phần của tệp zip trong trường hợp của tôi).
Daniel Lidström

1
@ DanielLidström Nó cũng hoạt động với các mã nhị phân với các thông số chính xác: Get-Content my.bin -Raw | Set-Content my.bin -NoNewlinesẽ không thay đổi my.binngoại trừ dấu thời gian. -Rawgiữ nguyên mọi byte CR / LF, đồng thời -NoNewlinengăn PowerShell thêm các byte CR / LF của chính nó.
Thomas

62

Không sử dụng >; nó làm rối loạn mã hóa ký tự. Sử dụng:

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

catlà một bí danh cho Get-Content.
n0rd

5
@ n0rd Tôi nghĩ nó giống như một thứ "sử dụng đường ống thay thế".
ksoo

Có thể xác nhận. Đang nhận ÿþđược FF FEở đầu tệp nối của tôi khi sử dụng >.
gpresland

16

Trong cmd, bạn có thể làm điều này:

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

Trong PowerShell, điều này sẽ là:

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

Mặc dù cách PowerShell sẽ là sử dụng gc , nhưng cách trên sẽ khá nhanh, đặc biệt là đối với các tệp lớn. Và nó cũng có thể được sử dụng trên các tệp không phải ASCII bằng cách sử dụng công /Btắc.


3
Đối với tôi, lệnh cat chạy nhiều lệnh có độ lớn dài hơn lệnh cmd / c (chạy rất nhanh); cảm ơn vì đã chỉ ra các tùy chọn!
Rob

Đây là câu trả lời tốt nhất.
Nicholas DiPiazza

12

Bạn có thể sử dụng lệnh ghép ngắn Add-Content . Có lẽ nó nhanh hơn một chút so với các giải pháp khác, vì tôi không truy xuất nội dung của tệp đầu tiên.

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

Để làm gì gctham khảo?
octopusgrabbus

gclà bí danh của Get-Content
MM.

8

Để nối các tệp trong dấu nhắc lệnh, nó sẽ là

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

PowerShell chuyển đổi typelệnh thành Get-Content, có nghĩa là bạn sẽ gặp lỗi khi sử dụng typelệnh trong PowerShell vì Get-Contentlệnh yêu cầu dấu phẩy phân tách các tệp. Lệnh tương tự trong PowerShell sẽ là

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

5

Nếu bạn cần sắp xếp các tệp theo tham số cụ thể (ví dụ: ngày giờ):

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

3

Tôi đã sử dụng:

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

Khoản tiền phạt phụ trội này. Tôi đã thêm mã hóa ASCII để xóa các ký tự nul mà Notepad ++ đang hiển thị mà không có mã hóa rõ ràng.


2

Bạn có thể làm điều gì đó như:

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

Đâu >là bí danh cho "out-file", và >> là bí danh cho "out-file -append".


2

Vì hầu hết các câu trả lời khác thường bị sai định dạng (do đường ống), điều an toàn nhất cần làm là như sau:

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

Tôi biết bạn muốn tránh đọc nội dung của $ SomeAdditionalFile thành một biến, nhưng để lưu định dạng dòng mới của bạn, tôi không nghĩ rằng có cách thích hợp để làm điều đó.

Một cách giải quyết là lặp qua dòng $ SomeAdditionalFile của bạn từng dòng và chuyển nó vào $ YourMasterFile của bạn. Tuy nhiên, điều này là quá nhiều tài nguyên.


1

Để tiếp tục mã hóa và kết thúc dòng:

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

Lưu ý: AFAIR, có các tham số không được Powershells cũ hỗ trợ (<3? <4?)


0

Tôi nghĩ "cách powerhell" có thể là:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.