PowerShell Set-Content и Out-File в чем разница?


в PowerShell какая разница между Out-File и Set-Content? Или Add-Content и Out-File -append?

Я нашел, если я использую оба против одного и того же файла, текст предательски mojibaked.

(второстепенный второй вопрос,> псевдоним Out-File, да?)

4 64

4 ответа:

вот краткое изложение того, что я вывел, после нескольких месяцев опыта работы с Powershell и некоторых научных экспериментов. Никогда не находил ничего из этого в документации : (

[обновление: многое из этого теперь, кажется, лучше документировано.]

чтение и запись блокировки

пока Out-File работает, другое приложение может прочитать файл журнала.

пока Set-Content работает, другие приложения не удается прочитать файл журнала. Таким образом никогда не используйте Set-Content для регистрации длительных команд.

кодирование

Out-File сохраняет в Unicode (UTF-16LE) кодировка по умолчанию (хотя это можно определить), тогда как Set-Content по умолчанию ASCII (US-ASCII) в PowerShell 3+ (это также может быть указан). В более ранних PowerShells,Set-Content написал содержание в Default (ANSI) кодирование.

Примечание редактора: PowerShell начиная с версии 5.1 еще по умолчанию для языка и региональных параметров Default ("ANSI") кодировка, несмотря на то, что утверждает документация. Если ASCII были по умолчанию, не ASCII символы, такие как ü будет преобразован в литерал?, но это не корпус: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' доходность $False.

PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt

это означает, что по умолчанию два команды несовместимы, и их смешивание приведет к повреждению текста, поэтому всегда указывайте кодировку.

форматирование

как объяснил Бартек,Out-File сохраняет причудливое форматирование вывода, Как видно в терминале. Так что в папке с двумя файлами, команда dir | out-file out.txt создает файл с 11 линии.

где Set-Content сохраняет более простое представление. В этой папке с двумя файлами, команда dir | set-content sc.txt создает файл с двумя строками. Для эмуляции выходных данных в терминале:

PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt

я считаю, что это форматирование имеет последствия для разрывов строк, но я пока не могу его описать.

создание файла

Set-Content не надежно создает пустой файл, когда Out-File будет:

в пустой папке команда dir | out-file out.txt создает файл, в то время как dir | set-content sc.txt нет.

Переменной Трубопровода

Set-Content принимает имя файла из конвейера; позволяет установить ряд содержимое файлов с некоторым фиксированным значением.

Out-File принимает данные как из конвейера; обновление содержимого одного файла.

параметры

Set-Content включает в себя следующие дополнительные параметры:

  • исключить
  • фильтр
  • включить
  • PassThru
  • поток
  • UseTransaction

Out-File включает в себя следующие дополнительные параметры:

  • добавить
  • NoClobber
  • ширина

для получения дополнительной информации о том, что эти параметры, пожалуйста, обратитесь к справке; например, get-help out-file -parameter append.

Out-File имеет поведение перезаписи выходного пути, если -NoClobber и/или -Append флаг установлен. Add-Content добавит содержимое, если выходной путь уже существует по умолчанию (если это возможно). Оба создадут файл, если он еще не существует.

еще одно интересное отличие заключается в том, что Add-Content создаст файл в кодировке ASCII по умолчанию и Out-File по умолчанию будет создан небольшой файл с кодировкой Юникода endian.

> и an псевдоним синтаксический сахар для Out-File. Это Out-File с некоторыми заранее определенными настройками параметров.

Ну, я бы не согласилась... :)

  1. Out-File has-Append (- NoClober существует, чтобы избежать перезаписи), который добавит контент. Но это уже не тот зверь.
  2. command / Add-Content будет использовать .Метод toString() на входе. Out-File будет использовать форматирование по умолчанию.

так:

ls | Add-Content test.txt

и

ls | Out-File test.txt

даст вам совершенно разные результаты.

и нет, ' > ' не псевдоним, это оператор перенаправления (так же как и в других оболочках). И имеет очень серьезные ограничения... Он будет вырезать линии так же, как они отображаются. Out-File имеет параметр-Width, который поможет вам избежать этого. Кроме того, с помощью операторов перенаправления вы не можете решить, какую кодировку использовать.

HTH Бартек

Set-Content поддерживает -Encoding Byte, в то время как Out-File нет.

поэтому, когда вы хотите записать двоичные данные или результат Text.Encoding#GetBytes() в файл, вы должны использовать Set-Content.