Вот краткое изложение того, что я сделал после нескольких месяцев работы с PowerShell и некоторых научных экспериментов. Я не нашел ничего из этого в документации :(
[ Обновление: многое из этого теперь, кажется, лучше задокументировано.]
Блокировка чтения и записи
Во время Out-File
работы другое приложение может читать файл журнала.
Во время Set-Content
работы другие приложения не могут прочитать файл журнала. Таким образом, никогда не используйтеSet-Content
для регистрации длительно выполняющихся команд.
Кодирование
Out-File
по умолчанию сохраняет в кодировке Unicode
( UTF-16LE
) (хотя это можно указать), тогда как по Set-Content
умолчанию в PowerShell 3+ используется кодировка ASCII
( US-ASCII
) (это также может быть указано). В более ранних версиях PowerShell 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
включает следующие дополнительные параметры:
- Исключить
- Фильтр
- Включают
- Пройти
- Ручей
- UseTransaction
Out-File
включает следующие дополнительные параметры:
- Добавить
- NoClobber
- Ширина
Для получения дополнительной информации об этих параметрах см. Справку; напр get-help out-file -parameter append
.
Set-Content
кодировка по умолчанию: переведена в(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, протестировано с использованием'řž'
строки с разными кодами в кодовых страницах выше).Out-File
в определенных ситуациях возникают проблемы с длинными линиями. Например:$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
имеет поведение перезаписи пути вывода, если не-NoClobber
установлен-Append
флаг и / или .Add-Content
добавит контент, если выходной путь уже существует по умолчанию (если может). Оба создадут файл, если он еще не существует.Еще одно интересное отличие состоит в том, что
Add-Content
по умолчанию создается файл в кодировке ASCII, а по умолчанию - файл сOut-File
прямым порядком байтов в кодировке Unicode.>
является синтаксическим сахаромпсевдонимадляOut-File
. ЭтоOut-File
с некоторыми предопределенными настройками параметров.источник
echo "" > $null | Add-Content abc.txt
он не создаст файлabc.txt
, а Out-File.Add-Content
ничего не получает. ЕслиAdd-Content
ничего не получает, зачем ему создавать файл? С другой стороны, тот же вопрос можно задать Out-File.gci $folder | Out-File log.txt ; cat log.txt
работает тогда какgci $folder | Add-Content log.txt ; cat log.txt
взрываетсяSet-Content
файл используется, он недоступен для других приложений.Что ж, я бы не согласился ... :)
так:
а также
даст вам совершенно другие результаты.
И нет, '>' не псевдоним, это оператор перенаправления (как и в других оболочках). И имеет очень серьезное ограничение ... Он будет обрезать линии так же, как они отображаются. В Out-File есть параметр -Width, который помогает избежать этого. Кроме того, с операторами перенаправления вы не можете решить, какую кодировку использовать.
HTH Bartek
источник
>
и Out-File - одно и то же. Они называют один и тот же код. Из PowerShell Брюса Пайетта в действии, второе издание (Kindle Locations 4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
>
которое не является точным эквивалентомout-file
. Если вы установите$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, он будет проигнорирован>
.Set-Content
поддерживает-Encoding Byte
, покаOut-File
нет.Поэтому, когда вы хотите записать двоичные данные или результат
Text.Encoding#GetBytes()
в файл, вы должны использоватьSet-Content
.источник
Out-file -append или ">>" могут фактически смешивать две кодировки в одном файле. Даже если файл изначально имеет формат ascii или ansi, он по умолчанию добавит Unicode в его нижнюю часть. Add-content проверит кодировку и сопоставит ее перед добавлением. Кстати, для export-csv по умолчанию используется ascii (без диакритических знаков), а для установки содержимого / добавления содержимого в ansi.
источник