Вот краткое изложение того, что я сделал после нескольких месяцев работы с 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, протестировано с использованием'řž'строки с разными кодами в кодовых страницах выше).