Tôi đang cố gắng sao chép chức năng của cat
lệ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.
Tôi đang cố gắng sao chép chức năng của cat
lệ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:
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
Là cat
một bí danh cho Get-Content
, và sc
là 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.
Set-Content
sử 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)
Add-Content
là 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
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
sẽ không thay đổi my.bin
ngoại trừ dấu thời gian. -Raw
giữ nguyên mọi byte CR / LF, đồng thời -NoNewline
ngăn PowerShell thêm các byte CR / LF của chính nó.
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
cat
là một bí danh cho Get-Content
.
ÿþ
được FF FE
ở đầu tệp nối của tôi khi sử dụng >
.
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 /B
tắc.
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
gc
tham khảo?
gc
là bí danh của Get-Content
Để 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 type
lệnh thành Get-Content
, có nghĩa là bạn sẽ gặp lỗi khi sử dụng type
lệnh trong PowerShell vì Get-Content
lệ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
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.
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".
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.