Я пытаюсь воспроизвести функциональность 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. Однако это слишком ресурсоемко.