Как объединить два текстовых файла в PowerShell?


Я пытаюсь воспроизвести функциональность команды " cat " в Unix.

Я хотел бы избежать решений, в которых я явно читаю оба файла в переменные, объединяю переменные вместе, а затем записываю объединенную переменную.

10 72

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 переключатель.

для объединения файлов в командной строке это будет

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. Однако это слишком ресурсоемко.

Я думаю, что "путь powershell" может быть:

set-content destination.log -value (get-content c:\FileToAppend_*.log )