Próbuję odtworzyć funkcjonalność cat
polecenia w systemie Unix.
Chciałbym uniknąć rozwiązań, w których jawnie wczytuję oba pliki do zmiennych, konkatenuję zmienne razem, a następnie wypisuję połączoną zmienną.
Próbuję odtworzyć funkcjonalność cat
polecenia w systemie Unix.
Chciałbym uniknąć rozwiązań, w których jawnie wczytuję oba pliki do zmiennych, konkatenuję zmienne razem, a następnie wypisuję połączoną zmienną.
Odpowiedzi:
Możesz po prostu użyć cat example1.txt, example2.txt | sc examples.txt
. Z pewnością możesz połączyć więcej niż dwa pliki z tym stylem. Ponadto, jeśli pliki mają podobne nazwy, możesz użyć:
cat example*.txt | sc allexamples.txt
cat
Jest aliasem Get-Content
, i sc
jest aliasem Set-Content
.
Uwaga 1 : Uważaj na tę drugą metodę - jeśli spróbujesz wyprowadzić do examples.txt
(lub coś podobnego, który pasuje do wzorca), PowerShell wpadnie w nieskończoną pętlę! (Właśnie to przetestowałem).
Uwaga 2 : Wyprowadzanie do pliku z >
nie zachowuje kodowania znaków! Dlatego zalecane jest użycie Set-Content
( sc
).
Set-Content
używa krajowej strony kodowej (np. Windows-1252 dla języka angielskiego). Jeśli pliki źródłowe zawierają inne kodowanie (np. Windows-1251 lub UTF8), należy ustawić prawidłowe kodowanie sc file.txt -Encoding UTF8
(liczby takie jak 1251 dla języka rosyjskiego są obsługiwane od wersji 6.2)
Add-Content
polega na tym, że jeśli uruchomisz polecenie dwa razy, zagregowany plik będzie dwukrotnie dłuższy. Dobry zamiennik to Out-File
. Przykład tutaj
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
nie zmieni się my.bin
z wyjątkiem sygnatur czasowych. -Raw
zachowuje wszystkie bajty CR / LF, jednocześnie -NoNewline
uniemożliwiając programowi PowerShell dodawanie własnych bajtów CR / LF.
Nie używać >
; psuje kodowanie znaków. Posługiwać się:
Get-Content files.* | Set-Content newfile.file
cat
jest aliasem dla Get-Content
.
ÿþ
która jest FF FE
na początku mojego połączonego pliku podczas używania >
.
W programie cmd
możesz to zrobić:
copy one.txt+two.txt+three.txt four.txt
W PowerShell byłoby to:
cmd /c copy one.txt+two.txt+three.txt four.txt
Podczas gdy sposobem PowerShell byłoby użycie gc , powyższe będzie dość szybkie, szczególnie w przypadku dużych plików. Może być również używany na plikach innych niż ASCII za pomocą /B
przełącznika.
Możesz użyć polecenia cmdlet Add-Content . Może jest trochę szybszy niż inne rozwiązania, bo nie pobieram zawartości pierwszego pliku.
gc .\file2.txt| Add-Content -Path .\file1.txt
gc
odnosi?
gc
jest aliasem dla Get-Content
Byłoby to łączenie plików w wierszu poleceń
type file1.txt file2.txt file3.txt > files.txt
PowerShell konwertuje type
polecenie na Get-Content
, co oznacza, że podczas korzystania z type
polecenia w programie PowerShell wystąpi błąd, ponieważ Get-Content
polecenie wymaga przecinka oddzielającego pliki. To samo polecenie w PowerShell byłoby
Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt
Użyłem:
Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log
-Encoding ASCII -Append
To dodane grzywny. Dodałem kodowanie ASCII, aby usunąć znaki nul, które Notepad ++ pokazywał bez jawnego kodowania.
Możesz zrobić coś takiego:
get-content input_file1 > output_file
get-content input_file2 >> output_file
Gdzie >
jest aliasem dla „out-file”, a >> jest aliasem dla „out-file -append”.
Ponieważ w większości innych odpowiedzi formatowanie jest często nieprawidłowe (ze względu na orurowanie), najbezpieczniejsze jest wykonanie następujących czynności:
add-content $YourMasterFile -value (get-content $SomeAdditionalFile)
Wiem, że chciałeś uniknąć wczytywania zawartości $ SomeAdditionalFile do zmiennej, ale aby zapisać na przykład formatowanie nowej linii, nie sądzę, aby można było to zrobić bez.
Rozwiązaniem byłoby zapętlenie $ SomeAdditionalFile wiersz po wierszu i przekierowanie go do $ YourMasterFile. Jednak jest to nadmiernie wymagające zasoby.