Ось короткий виклад того, що я вивів після кількох місяців досвіду роботи з 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 '?'yields $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 включає наступні додаткові параметри:
Для отримання додаткової інформації про те, що це за параметри, зверніться до довідки; напр get-help out-file -parameter append.
Set-Contentкодування за замовчуванням: переведено у(Get-Culture).Textinfo.ANSICodePage(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ, CurrentUICultureen-GB, ANSICodePage1250, OEMCodePage852, протестовано із використанням'řž'рядка з різними кодами на наведених вище кодових сторінках).