PowerShell Set-Content и Out-File в чем разница?
в PowerShell какая разница между Out-File
и Set-Content
? Или Add-Content
и Out-File -append
?
Я нашел, если я использую оба против одного и того же файла, текст предательски mojibaked.
(второстепенный второй вопрос,>
псевдоним Out-File
, да?)
4 ответа:
вот краткое изложение того, что я вывел, после нескольких месяцев опыта работы с Powershell и некоторых научных экспериментов. Никогда не находил ничего из этого в документации : (
[обновление: многое из этого теперь, кажется, лучше документировано.]
чтение и запись блокировки
пока
Out-File
работает, другое приложение может прочитать файл журнала.пока
Set-Content
работает, другие приложения не удается прочитать файл журнала. Таким образом никогда не используйтеSet-Content
для регистрации длительных команд.кодирование
Out-File
сохраняет вUnicode
(UTF-16LE
) кодировка по умолчанию (хотя это можно определить), тогда какSet-Content
по умолчаниюASCII
(US-ASCII
) в PowerShell 3+ (это также может быть указан). В более ранних PowerShells,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
включает в себя следующие дополнительные параметры:
- исключить
- фильтр
- включить
- PassThru
- поток
- UseTransaction
Out-File
включает в себя следующие дополнительные параметры:
- добавить
- NoClobber
- ширина
для получения дополнительной информации о том, что эти параметры, пожалуйста, обратитесь к справке; например,
get-help out-file -parameter append
.
Out-File
имеет поведение перезаписи выходного пути, если-NoClobber
и/или-Append
флаг установлен.Add-Content
добавит содержимое, если выходной путь уже существует по умолчанию (если это возможно). Оба создадут файл, если он еще не существует.еще одно интересное отличие заключается в том, что
Add-Content
создаст файл в кодировке ASCII по умолчанию иOut-File
по умолчанию будет создан небольшой файл с кодировкой Юникода endian.
>
иan псевдонимсинтаксический сахар дляOut-File
. ЭтоOut-File
с некоторыми заранее определенными настройками параметров.
Ну, я бы не согласилась... :)
- Out-File has-Append (- NoClober существует, чтобы избежать перезаписи), который добавит контент. Но это уже не тот зверь.
- command / Add-Content будет использовать .Метод toString() на входе. Out-File будет использовать форматирование по умолчанию.
так:
ls | Add-Content test.txt
и
ls | Out-File test.txt
даст вам совершенно разные результаты.
и нет, ' > ' не псевдоним, это оператор перенаправления (так же как и в других оболочках). И имеет очень серьезные ограничения... Он будет вырезать линии так же, как они отображаются. Out-File имеет параметр-Width, который поможет вам избежать этого. Кроме того, с помощью операторов перенаправления вы не можете решить, какую кодировку использовать.
HTH Бартек