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