Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Блокировка чтения и записи

Во время работы Out-File другое приложение может прочитать файл журнала.

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

кодирование

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

Редактор к сведению: PowerShell в версии 5.1 еще дефолты к культуре конкретного Default ( "ANSI") кодирования, несмотря на точто претензии к документации.Если бы ASCII был по умолчанию, не-ASCII символы, такие как ü были бы преобразованы в литералы ? но это не так: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?''ü' | 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 dir | out-file out.txt создает файл с 11 строками.

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

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

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

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

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

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

Переменная трубопровода

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

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

параметры

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

  • исключать
  • Фильтр
  • Включают
  • Пройти
  • Поток
  • UseTransaction

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

  • присоединять
  • NoClobber
  • ширина

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

Ответ 2

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

Еще одно интересное различие заключается в том, что Add-Content по умолчанию создаст файл с кодировкой ASCII, а Out-File по умолчанию создаст файл с кодировкой в ​​кодировке little endic unicode.

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

Ответ 3

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

  • В Out-File есть -Append (-NoClober, чтобы избежать перезаписи), который будет добавлять-Content. Но это не тот самый зверь.
  • команда | Add-Content будет использовать метод .ToString() для ввода. Out-File будет использовать форматирование по умолчанию.

так:

ls | Add-Content test.txt

и

ls | Out-File test.txt

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

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

НТН Bartek

Ответ 4

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

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

Ответ 5

Исходящий файл -append или ">>" может фактически смешивать две кодировки в одном файле. Даже если файл изначально ascii или ansi, он по умолчанию добавит юникод в конец файла. Add-content проверит кодировку и сопоставит ее перед добавлением. Кстати, для export-csv по умолчанию задано ascii (без акцентов) и set-content/add-content для ansi.