Ответ 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
.