@oɔɯǝɹの回答にあるドキュメントは、やや接線的なソースではありますが、優れています。
古いPowerShell ISEを置き換える予定のVisual Studio Codeを使用してから、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
。個人的には、小文字を使用し、コマンドをPascalの場合のままにしておきますが、どちらも同様に一般的です。
その他:
常にパラメーターを指定します。位置の順序に依存しないでください。 New-Object -TypeName System.Int32
以上New-Object System.Int32
。それが合意されているかどうかはわかりませんが、繰り返しますが、「曖昧さのない」という一般的な考え方を支持しているようです。
モジュールを作成する場合、で示される標準の動詞を使用しGet-Verb
ます。ただし、このリストは非常に狭いため、私だけが実行することが多いスクリプトのスタンドアロンスクリプト名はそうではありません。一般的な動詞リストの問題は、に向かう傾向があるということGet-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
です。PDFファイルから特定のページを抽出するスクリプトを作成している場合、それを呼び出していませんGet-ExtractedAccountPDFPages.ps1
。私はそれを呼んでいExtract-AccountPDFPages.ps1
ます。プログラムとして実行されるスクリプトの発見可能性については心配していませんが、その性質上、モジュール化されることを意図していません。
読みやすく、具体的に、または保守しやすいときにルールを破ります。