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 Бартек