Ось короткий виклад того, що я вивів після кількох місяців досвіду роботи з 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
, протестовано із використанням'řž'
рядка з різними кодами на наведених вище кодових сторінках).