Документи у відповіді @ oɔɯǝɹ є хорошим, хоча дещо дотичним джерелом.
Якщо ви використовуєте код Visual Studio, який планується замінити старіший PowerShell ISE, а потім встановіть розширення VS Code PowerShell , яке включає кілька варіантів форматування, які, принаймні частково, базувалися на неофіційному посібнику з найкращих практик та стилю PowerShell . І VS Code, і розширення PowerShell управляються корпорацією Майкрософт, тому це приблизно так само офіційно, як і неофіційне керівництво.
Я не згоден з усім, про що вони заявляють. Наприклад, я надходжу з PHP, Java, C # і SQL, де очікуються крапки з комою, якщо вони не потрібні. Код виглядає неправильно для мене без них, тому я включаю їх. Якби #requires SemicolonTerminator
я мав би це ввімкнути для більшості моїх сценаріїв, тому мені не доведеться турбуватися про те, що пробіл порушив лінію. Я ненавиджу уникнути повернення вагона та інших VB-образів.
Решта з них - моя думка:
Використовувати справжнє ім'я командлета або псевдонім?
Будьте однозначними. Ніколи не використовуйте псевдонім у збереженому сценарії; навіть псевдонім за замовчуванням. Ніщо не заважає користувачеві змінювати псевдоніми за замовчуванням. Безпечніше вважати, що вони непорушні.
Вкажіть назву параметра командлет повністю або лише частково (dir -Повторити проти dir -r)
Знову будьте однозначними. Повні назви параметрів мають найкращу сумісність у прямому напрямку. -r
сьогодні може бути однозначним, але ніщо не зупиняє майбутні версії команди від введення нових параметрів. Ви будете використовувати IDE (або ISE, або VS-код). Натисніть Ctrl+ Spaceта автоматично заповніть цей параметр.
Зауважте, ls -r
це неоднозначно. -ReadOnly
є ще одним параметром Get-ChildItem
.
Вказуючи рядкові аргументи для командлетів, ви додаєте їх до лапок (New-Object 'System.Int32' проти New-Object System.Int32
Загалом, лапки слід використовувати лише за необхідності (наприклад, New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
використовувати одиничні лапки, коли можна, і лише подвійні лапки, коли потрібно інкапсулювати окремі лапки або потрібно вставляти змінні.
При написанні функцій та фільтрів ви вказуєте типи параметрів?
Зазвичай я це роблю, якщо мені спеціально не потрібно приймати найрізноманітніші типи з одним і тим же параметром і не хочу писати окремі набори параметрів.
Ви пишете командлети в (офіційному) правильному відмінку?
Справа Паскаля. Так.
Для таких ключових слів, як ПОЧАТОК ... ПРОЦЕС ... КІНЦЕ ви пишете їх лише в великих літерах?
Я бачив заяви, оператори і конструкції мови , як Begin
, If
, ForEach
, -NotIn
а також begin
, if
, foreach
, -notin
. Особисто я віддаю перевагу нижній регістр і залишаю команди як регістр Паскаля, але обидва вони однаково поширені.
Інші:
Завжди вказуйте параметри. Не покладайтеся на позиційне замовлення. New-Object -TypeName System.Int32
над New-Object System.Int32
. Я не знаю, чи це було домовлено, але, знову ж таки, здається, підтримує загальну ідею "бути однозначним".
Якщо я пишу модуль, я використовую стандартні дієслова , позначені Get-Verb
. Цей список надзвичайно вузький, тому самостійні назви сценаріїв для сценаріїв, які тільки я сам запускаю, часто не роблять. Проблема зі списком родових дієслів полягає в тому, що він прагне до Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
. Якщо я пишу сценарій, який витягує певні сторінки з PDF-файлу, я його не називаю Get-ExtractedAccountPDFPages.ps1
. Я це називаю Extract-AccountPDFPages.ps1
. Мене не хвилює виявлення скрипту, який працює як сама програма і не призначений бути модульним за своєю суттю.
Порушуйте правила, коли це читабельніше, конкретніше чи більш доцільне.