Как объединить два текстовых файла в PowerShell?
Я пытаюсь воспроизвести функциональность команды " cat " в Unix.
Я хотел бы избежать решений, в которых я явно читаю оба файла в переменные, объединяю переменные вместе, а затем записываю объединенную переменную.
10 ответов:
вы можете просто использовать
cat example1.txt, example2.txt | sc examples.txt
. Вы можете, конечно, объединить более двух файлов с этим стилем, тоже. Кроме того, если файлы называются аналогично, вы можете использовать:cat example*.txt | sc allexamples.txt
The
cat
псевдонимGet-Content
иsc
псевдонимSet-Content
.Примечание 1: будьте осторожны с последним методом - если вы пытаетесь вывести на
examples.txt
(или аналогично, что соответствует шаблону), PowerShell попадет в бесконечный петля! (Я только что проверил это).примечание 2.: вывод в файл с
>
не сохраняет кодировку! Вот почему с помощьюSet-Content
(sc
) рекомендуется.
не используйте
cat
...>
; это портит кодировку символов. Использование:Get-Content files.* | Set-Content newfile.file
мне потребовалось несколько часов, чтобы это выяснить.
на
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. Может быть, это немного быстрее, чем другие решения, потому что я не получить содержимое первого файла.
gc .\file2.txt| Add-Content -Path .\file1.txt
для объединения файлов в командной строке это будет
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
Я:
Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log -Encoding ASCII -Append
этому добавляется нормально. Я добавил кодировку ASCII, чтобы удалить символы nul Notepad++ показывал без явной кодировки.
Если вам нужно упорядочить файлы по определенному параметру (например, дата и время):
gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log
Вы можете сделать что-то вроде:
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. Однако это слишком ресурсоемко.