Я пытаюсь воспроизвести функциональность cat
команды в Unix.
Я бы хотел избежать решений, в которых я явно считываю оба файла в переменные, объединяю переменные вместе, а затем записываю объединенную переменную.
Я пытаюсь воспроизвести функциональность cat
команды в Unix.
Я бы хотел избежать решений, в которых я явно считываю оба файла в переменные, объединяю переменные вместе, а затем записываю объединенную переменную.
Ответы:
Вы можете просто использовать 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
).
Set-Content
используется национальная кодовая страница (например, Windows-1252 для английского языка). Если исходные файлы содержат другую кодировку (например, Windows-1251 или UTF8), вы должны установить правильную кодировку sc file.txt -Encoding UTF8
(числа, такие как 1251 для русского языка, поддерживаются с
Add-Content
том, что если вы запустите команду дважды, агрегированный файл будет вдвое длиннее. Хорошая замена есть Out-File
. Пример здесь
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
не будет изменяться, my.bin
кроме отметок времени. -Raw
сохраняет любые байты CR / LF, -NoNewline
не позволяя PowerShell добавлять собственные байты CR / LF.
Не использовать >
; это портит кодировку символов. Использование:
Get-Content files.* | Set-Content newfile.file
cat
это псевдоним для Get-Content
.
ÿþ
что находится FF FE
в начале моего объединенного файла при использовании >
.
В 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
gc
относится?
gc
это псевдоним для Get-Content
Чтобы объединить файлы в командной строке, это будет
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, чтобы удалить нулевые символы, которые Notepad ++ показывал без явной кодировки.
Вы можете сделать что-то вроде:
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. Однако это слишком ресурсоемко.