よく知られているPowerShellのコーディング規則はありますか?


18

PowerShellでプログラミングする場合、明確に定義された規則はありますか?

たとえば、長期的に維持されるスクリプトでは、次のことを行う必要がありますか?

  • 実際のコマンドレット名またはエイリアスを使用しますか?
  • コマンドレットパラメーター名を完全にまたは部分的にのみ指定します(dir -Recursedir -r
  • コマンドレットの文字列引数を指定するときは、(引用符で囲みますNew-Object 'System.Int32'New-Object System.Int32
  • 関数とフィルターを作成するとき、パラメーターのタイプを指定しますか?
  • (公式の)正しいケースでコマンドレットを作成しますか?
  • のようなキーワードのBEGIN...PROCESS...END場合、大文字のみで記述しますか?

MSDNにはPowerShellのコーディング規約ドキュメントが欠けているようですが、そのようなドキュメントはC#などに存在します。




2
このような規約を文書化しようとするコミュニティプロジェクトがあります。github.com/PoshCode/PowerShellPracticeAndStyle。もちろん、ばらつきがあります。スタイルは非常に個人的なものです。
クリスデント

回答:


8

@Robert Harveyはいくつかの良い公式リンクを参照しました。あまり正式ではない文書として、私の考えは次のようになります。

実際のコマンドレット名またはエイリアスを使用しますか?

エイリアスは、フルネームよりも明確な場合にのみ使用してください。たとえば、ほとんどの人は以前の経験に基づいてよりもスクリプトを見つけdirたりls、明確にしたりすると思いますGet-ChildItem(たとえば、基本的に、PowerShellスクリプトを書く人はDOSバッチスクリプトまたはUnixスクリプトのいずれかでこれら2つのいずれかを持っています)。

コマンドレットパラメーター名を完全にまたは部分的にのみ指定します(dir -Recurseとdir -r)

スクリプトでは、(上記の例とは異なり)短いスイッチが実際にそれを綴るよりも明確になる時間を考えることができないため、名前を完全に綴ります。スイッチ名を短くすると、入力を節約できます。コマンドラインでは、これは必須です。スクリプトでは、余分なキーストロークは読みやすさと保守性のために価値があります。

コマンドレットの文字列引数を指定するときは、それらを引用符で囲みます(New-Object 'System.Int32'対New-Object System.Int32

文字列引数を引用符で囲むことは、コードを読むときにはるかに明確に見えるので、それらを含めます。

関数とフィルターを作成するとき、パラメーターのタイプを指定しますか?

通訳者のあいまいさを解決するためにそうする必要がある場合にのみ(実際に起こります)。すべてに型を付けようとする場合は、C#コマンドラインアプリケーションを作成することもできます(これは必ずしも悪いことではありませんが、スクリプトを作成することで得られる時間の節約を無効にします)。

(公式の)正しいケースでコマンドレットを作成しますか?

する必要があります。私は通常します。急いでいると、構文的に問題にならないので、私はケースが少し緩いことがわかっています。

BEGIN ... PROCESS ... ENDなどのキーワードの場合、大文字のみで記述しますか?

いいえ。これはFORTRANではありません。ほとんどの人がを見つけるbeginか、Beginより読みやすいと思うBEGIN。すべての上限をオンラインで叫ぶことと関連付け、プログラムの最もありふれた部分を叫ぶことは、最も重要でない部分に注意を引くことによって読みやすさを妨げる理由があります。

指導原則は読みやすさであるべきです。スクリプトは、その性質上、高速で汚いプログラムであるため、書き込み専用のコードに向かっています。あなたとあなたのチームが6か月以内にスクリプトを理解できるように、すべての決定を下すべきです。コードを見るときは自分の靴を脱いでこの質問をしてみてください。紛らわしい?」


2

マイクロソフトは、非常に優れた一連のCmdlet開発ガイドラインを作成して公開しています。

抜粋:

このセクションのトピックでは、整形式のコマンドレットを作成するために使用できる開発ガイドラインを提供します。Windows PowerShellランタイムが提供する共通機能を活用し、これらのガイドラインに従うことにより、最小限の労力で堅牢なコマンドレットを開発し、ユーザーに一貫したエクスペリエンスを提供できます。さらに、一般的な機能では再テストが必要ないため、テストの負担が軽減されます。

このセクションで

これらのガイドラインはどの言語にも限定されておらず(言語については言及していません)、PowerShellでコマンドレットを記述するときに完全に適用できます。

これらのガイドラインを使用すると、明確で、発見可能で、使用可能で、再利用可能なコマンドレットを作成するのに役立ちます。これらのガイドラインに従っていくつかのPowerShellモジュールを作成した後は難しいことではなく、PowerShell開発者になるのに役立ちました。このスキルは、単純なスクリプトを作成するときにも直接使用できます。


1
これらは、PowerShellを記述する方法よりも、コマンドレットを記述する方法についてのようです。
フィリップケンダル

@PhilipKendall彼らは確かにそうします。これは完全な質問に答えないかもしれませんが、私はこれが質問に価値を加えると信じています。純粋なPowerShellでCmdletを完全に記述でき、これらのガイドラインも同様に役立つことに注意してください。PowerShellで適切なCmdletを作成できる場合は、PowerShellスクリプトも作成できます。
oɔɯǝɹ

1

2番目の答えとして。PSScriptAnalyzerモジュールを使用してコードを検証できます。

Invoke-ScriptAnalyzer -Path .

これは、ルールセットを使用したコード分析に基づいています。コード設計を検証し、コード内の多くの小さな問題を検出するのに役立ちます。

ビルド(モジュールのビルドとプライベートリポジトリを使用)に組み込み、設計と品質の問題をキャッチしました。

興味がある場合、このモジュールにはPowerShellコードフォーマッター(複数のスタイルを使用できる)も含まれているため、それを使用してコードレイアウトを標準化することもできます。


0

@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などのキーワードの場合、大文字のみで記述しますか?

私はと文、演算子、および言語構造を見てきましたBeginIfForEach-NotInなどbeginifforeach-notin。個人的には、小文字を使用し、コマンドをPascalの場合のままにしておきますが、どちらも同様に一般的です。

その他:

  • 常にパラメーターを指定します。位置の順序に依存しないでください。 New-Object -TypeName System.Int32以上New-Object System.Int32。それが合意されているかどうかはわかりませんが、繰り返しますが、「曖昧さのない」という一般的な考え方を支持しているようです。

  • モジュールを作成する場合、で示される標準の動詞を使用しGet-Verbます。ただし、このリストは非常に狭いため、私だけが実行することが多いスクリプトのスタンドアロンスクリプト名はそうではありません。一般的な動詞リストの問題は、に向かう傾向があるということGet-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1です。PDFファイルから特定のページを抽出するスクリプトを作成している場合、それを呼び出していませんGet-ExtractedAccountPDFPages.ps1。私はそれを呼んでいExtract-AccountPDFPages.ps1ます。プログラムとして実行されるスクリプトの発見可能性については心配していませんが、その性質上、モジュール化されることを意図していません。

  • 読みやすく、具体的に、または保守しやすいときにルールを破ります。


-3

長年にわたって、変数、関数などのマルチワード名を記述するさまざまな方法がありました。

PROGRAMFORSORTINGLOTSOFTHINGSは読みにくいです。

PROGRAM_FOR_SORTING_LOTS_OF_THINGSは少し簡単です。

program_for_sorting_lots_of_thingsはまだ簡単です。

ProgramForSortingLotsOfThingsはアンダースコアを廃止し、読みやすさを維持します。Powershellはほとんどの場合これを行います。


Powershellは通常、ラクダケーシング(構文的には何の意味もありません)とダッシュを組み合わせて使用​​します。たとえばGet-ChildItem、動詞と名詞の間にダッシュがあります。
アンドリューは、モニカーを復活させる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.