2012-01-05 4 views
65

Я пытаюсь воспроизвести функциональность команды «cat» в Unix.Как объединить два текстовых файла в PowerShell?

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

ответ

80

Вы можете просто использовать cat example1.txt, example2.txt | sc examples.txt. Вы также можете объединить более двух файлов с этим стилем. Кроме того, если файлы называются так же, вы можете использовать:

cat example*.txt | sc allexamples.txt 

cat является псевдонимом для Get-Content и sc является псевдонимом для Set-Content.

Примечание 1: Будьте осторожны с последним способом - если вы попытаетесь вывести на examples.txt (или аналогичный, который соответствует шаблону), PowerShell будет попасть в бесконечный цикл! (Я только что проверил это).

Примечание 2: вывод в файл с > не сохраняет кодировку символов! Вот почему рекомендуется использовать Set-Content (sc).

+0

Только в случае, если кто-то хочет, чтобы перебирать файлы с _GET -ChildItems | Foreach-Object_, вы можете использовать Add-Content вместо Set-Content. В противном случае целевой файл перезаписывается на каждой итерации. – Jonas

1

Вы можете сделать что-то вроде:

get-content input_file1 > output_file 
get-content input_file2 >> output_file 

Где > это псевдоним «из-файла», и >> является псевдонимом «из-файла -Append».

12

В 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.

+2

Для меня команда cat работает на несколько порядков больше, чем команда cmd/c (которая работает очень быстро); спасибо за указание опции! – Rob

10

Вы можете использовать командлет Add-Content. Возможно, это немного быстрее, чем другие решения, потому что я не извлекаю содержимое первого файла.

gc .\file2.txt| Add-Content -Path .\file1.txt 
44

Не используйте cat ... >; это испортит кодировку символов. Использование:

Get-Content files.* | Set-Content newfile.file 

Мне потребовались часы, чтобы это выяснить.

+0

'cat' - это псевдоним для' Get-Content'. – n0rd

+3

@ n0rd Я думаю, что это скорее «использование конвейера». – ksoo

1

Поскольку большинство других ответов часто получают форматирование неправильно (из-за трубопровода), самая безопасная вещь, чтобы сделать это следующим образом:

add-content $YourMasterFile -value (get-content $SomeAdditionalFile) 

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

Обходным путем было бы перебрать ваш $ SomeAdditionalFile по строкам и трубопроводам в ваш $ YourMasterFile. Однако это чрезмерно ресурсоемкий.

3

я использовал:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append 

Этой прилагаемую штраф. Я добавил кодировку ASCII, чтобы удалить nul-символы, которые Notepad ++ показывал без явной кодировки.

0

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

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

Чтобы Concat файлов в командной строке, это будет

type file1.txt file2.txt file3.txt > files.txt

Powershell преобразует команду типа для Get-Content, который означает, что вы получите сообщение об ошибке при использовании команды type в powershell, потому что команде Get-Content требуется запятая, разделяющая файлы. Та же команда в PowerShell будет

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

1

Если вам необходимо заказать файлы по определенному параметру (например, время, даты):

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log 
Смежные вопросы