Документы в ответе @ oɔɯǝɹ - хороший, хотя и несколько косвенный источник.
Если вы используете код Visual Studio, который планируется заменить устаревший PowerShell ISE, а затем установить расширение VS Code PowerShell , которое включает несколько параметров форматирования, которые хотя бы частично основаны на неофициальном руководстве по рекомендациям и стилю PowerShell . И VS Code, и расширение PowerShell управляются Microsoft, поэтому оно является настолько же официальным, сколь и неофициальным руководством.
Я не согласен со всем, что они заявляют. Например, я пришел из PHP, Java, C # и SQL, где точки с запятой ожидаются, если не требуется. Код выглядит неправильно для меня без них, поэтому я включаю их. Если бы это было, #requires SemicolonTerminator
я бы включил его в большинстве моих сценариев, чтобы мне не пришлось беспокоиться о пробелах, ломающих строку. Я ненавижу избегать возврата каретки и других VB-измов.
Остальные это мое мнение:
Использовать настоящее имя или псевдоним командлета?
Будь однозначным. Никогда не используйте псевдоним в сохраненном скрипте; даже псевдоним по умолчанию. Ничто не мешает пользователю изменять псевдонимы по умолчанию. Безопаснее предположить, что они не неизменны.
Укажите имя параметра командлета полностью или только частично (dir -Recurse против 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 ... PROCESS ... END, вы пишете их только в верхнем регистре?
Я видел заявления, операторы и конструкции языка , как 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
. Меня не волнует возможность обнаружения сценария, который запускается как сама программа и не предназначен для модульности по самой своей природе.
Нарушайте правила, когда это становится более читабельным, более конкретным или более понятным.