Próbuję odtworzyć funkcjonalność catpolecenia 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ść catpolecenia 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
catJest aliasem Get-Content, i scjest 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-Contentuż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-Contentpolega 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 -NoNewlinenie zmieni się my.binz wyjątkiem sygnatur czasowych. -Rawzachowuje wszystkie bajty CR / LF, jednocześnie -NoNewlineuniemoż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
catjest aliasem dla Get-Content.
ÿþktóra jest FF FEna początku mojego połączonego pliku podczas używania >.
W programie cmdmoż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ą /Bprzełą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
gcodnosi?
gcjest aliasem dla Get-Content
Byłoby to łączenie plików w wierszu poleceń
type file1.txt file2.txt file3.txt > files.txt
PowerShell konwertuje typepolecenie na Get-Content, co oznacza, że podczas korzystania z typepolecenia w programie PowerShell wystąpi błąd, ponieważ Get-Contentpolecenie 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.