2013-02-03 67 views
27

私は定期的に自分の機能やスクリプトに[cmdletbinding()]を使用しますが、このような難解なものはいつも見つけています。
CmdletBinding属性は がそれらをコンパイルするコマンドレット[cmdletbinding()]とは何ですか実際にはどのように機能しますか?

ように動作するが、我々は我々のスクリプトの上にそれを使用することができます機能の属性であるget-help about_Functions_CmdletBindingAttribute

によると、この関数は何ですかケース?すべての入力に対してpsエンジンによって呼び出される内部暗黙的な「main」関数?今構文について

:私たちは何を

[CmdletBinding(ConfirmImpact=<String>, 
        DefaultParameterSetName=<String>, 
        HelpURI=<URI>, 
        SupportsPaging=<Boolean>, 
        SupportsShouldProcess=<Boolean>, 
        PositionalBinding=<Boolean>)] 

をやっていますか? cmdlbindingオブジェクトをインスタンス化し、コンストラクタに引数リストを渡しますか?この構文はparam()で見つけることができます。たとえば、[Parameter(ValueFromPipeline=$true)]この構文には特定の名前がありますが、他の場所にはありますか?

最後に、単純なpowershellersとして、この機能を模倣し、属性を設定してスクリプトの動作を変更できますか?

+4

私はドキュメントは少しここで誤解を招くされていると思います。このすべては、スクリプトブロックのいずれかのタイプに関係しています:Shayが言及したように - 関数名、パス(スクリプト)で指定されていますが、*名前もありません。 '&{[CmdletBinding()] param()Write-Verbose' Foo '} -Verbose'はチャンピオンのように動作します。 – BartekB

+0

@BartekB質問の最初の部分は大丈夫です。 –

答えて

11

CmdletBinding、Parameterなどは、スクリプト作成者がPowerShellの動作を定義するために使用できる特別な属性クラスです。 Cmdlet機能を備えた高度な機能を作成する。

[CmdletBinding()]クラスの新しいインスタンスを初期化します。でParameterAttributeクラスの詳細を読むMSDN

がでCmdletBindingAttributeクラスの詳細を読むMSDN構文の質問に関しては属性クラスherehere

+0

OK。したがって、完全な構文を使用する場合、パブリックメンバーの値を設定するために使用されるハッシュテーブルをコンストラクタに渡します。途中で –

+0

です。ハッシュテーブルは ';'で区切られます。私はこれがPowerShellプロセスが使用できる特別なタイプのクラスと構築方法だと思います。あなたはそれを例えば以下のように考えることができます。 '新しい質問{テキスト="いくつかの質問 "};' C#で推測します。どのように動作しているか知りたいのであれば、私のMSDNリンクで指定されているライブラリを逆コンパイルし、読み込み可能かどうかを調べることができます。 –

+0

はい、ハッシュテーブルの並べ替え:)。 –

5

一般的に言えば、CmdletBindingは、高度な機能の機能を作ります。それをスクリプトの先頭に置くと、スクリプトは「高度な」スクリプトになります。関数とスクリプトはほぼ同じです。ここで、スクリプトファイル名は関数名と等価であり、スクリプトの内容は関数のscripblockセクションに相当します。

CmdletBinding属性を使用すると、ConfirmおよびWhatIfサポートの追加(SupportsShouldProcess経由)、パラメータの位置バインディングの無効化など、関数の機能を制御できます。

+0

こんにちはシェイ、私は操作の内部の方法について疑問に思っています... –

2

について

より、フォーマットが密接に一致しますC#で名前付きパラメータを使用してメンバーに.NET属性クラスを適用する方法

C# Language SpecificationのそのセクションからC.2.13The PowerShell Language SpecificationのセクションB.2.4から属性の(簡体字)文法を比較:

B.2。4属性  (PowerShellの)

属性:
  [属性名(属性引数) ]

属性引数:
 属性引数
 属性引数
,属性引数

属性引数:
  [のattr:
 単純名
=表現


C.2.13は  (C#の)

属性属性ibute名(名前付き引数リスト) ]

名前付き引数リスト:
 名前付き引数
 名前付き引数リスト
,名前付き引数

named-引数:
 識別子
=attribute-argument-expression



私はそれは概念的な簡潔さの感覚から、例えばに素敵だったかもしれない同意します属性の初期化にハッシュテーブル初期化構文を再利用するしかし、私はハプテーブル([A(P=v)][A('P'=v)]$n = 'P'; [A($n=v)]のようなもの、またはそれらの特定のサブセットのような)からハッシュテーブルのすべてのオプションをサポートすることが想像できます。;を区切り文字として使用するのは価値がありました。あなたは高度な機能を使用したい場合一方、多分それは、高度な構文を学ぶことは理にかなって

:)

+0

属性、彼らが扱っていないので、ハッシュテーブルの構文をサポートしていません。通常のキーと値でこれらのキーは、 'System.Attribute'を拡張するクラスの明確に定義されたプロパティに対応しています。 – Zenexer

+0

@Zenexer:それはC#のような構文をサポートするための引数ですが、言語に制約はありません。同様に、ハッシュテーブルに「foo」プロパティが実際には存在しない場合でも、ハッシュテーブル '$ h = @ {foo = 2}'を定義し、プロパティ構文で '$ h.foo'を使って要素にアクセスできます。あるケースでは、言語設計者は柔軟な構文を選択し、もう1つはより単純な構文をサポートすることを選択しました。 –

+0

確かにある程度の言語設計が必要ですが、PowerShellは.NET上にあることに注意してください。 PowerShellの属性は.NETの属性なので、.NET属性の規則に従わなければなりません。もちろん、.NETの属性を拡張してPowerShell固有のバージョンを提供することも可能ですが、PowerShellの性質上、.NETの属性を定義する方法が必要です。 – Zenexer

関連する問題