2016-12-07 4 views
1

次のことが可能かどうかわかりませんでした。それはそうではないように見えるが、私はコミュニティに尋ねると思った。スクリプトのパラメータバインドの順序を制御できますか?

のは、私はこのように、スクリプトパラメータの簡単な取り扱いを持っているとしましょう:

[CmdletBinding()] 
Param(
    [parameter(Position=0)] 
    [string] version, 

    [parameter(Position=1)] 
    [ValidateScript({ SomeModule/Search(version, $_); $true # FIND THIS VERSION IN SOURCE. **VERSION MUST HAVE BEEN SET BY NOW** })] 
    [string] source, 
) 

今、私たちは「バージョン」は、コンポーネントのバージョンを表し、「ソース」を検索するには、いくつかのソース(場所)を表して言うことができます(複数のソースになる可能性があります)。私が実際に検索(ソース、バージョン)と呼ぶことができる最も早いのはValidateScript {}であり、これは良いことです。検索(...)で何らかのエラーが発生した場合、他のパラメータの処理を続行しません。また、(...){}ステートメントがコードの後半にある場合は、パラメータが渡されたかどうかを確認してから何らかのアクションを実行する必要がある場合はの束を削除します。ただし、提供される値の順序は重要です。

これは問題ありません。値は正しい順序で提供されます

MyScript.ps1 -version 12345ABC -source 'filesystem' 

これは問題ありません。値は正しい順序で供給されます。位置拘束が有効です。

MyScript.ps1 12345ABC 'filesystem' 

これは機能しません。値は順序私はパラメータ名が使用されている場合、特定の順序を必要とするクライアントに制限をかけたくない

MyScript.ps1 -source 'filesystem' -version 12345ABC 

(ビューのスクリプトロジック・ポイントから)間違っに供給されています。

回避策として、私は$ ARGSを再配置することができましたが、[CmdletBinding]の前にコードを作成することはできません。 $ ARGSで注文を変更し、MyScript.ps1を呼び出す新しいスクリプトを作成できました。これは素晴らしい解決策ではありませんが。私はPS 4.0を使用しています。

答えて

0

名前付きパラメータは、Positionにバインドされていないため、任意の順序で指定できます。

これらの2つのは、名前付きパラメータのとおり、と互換性があります。

MyScript.ps1 -version 12345ABC -source 'filesystem' 

MyScript.ps1 -source 'filesystem' -version 12345ABC 

位置パラメータが明示的に指定されていない、とあなたのparamsにPositionで定義された正しい順序にする必要があります。

MyScript.ps1 12345ABC 'filesystem' 
+0

私は同じようにそれを呼び出すしたいと思います: 'ファイルシステム' -source -version 12345ABCまずはPSプロセスの変換を行ってください。 –

+0

他のコメントから理解できれば、あなたの問題は実際には 'ValidateScript'であり、ファイルシステムの前にバージョンを指定しないとスクリプトは動作しませんか? –

+0

はい、そうです。 ValidateScript for sourceはすでにバージョンが設定されていると予想しているので、 –

0

私はこの問題は、あなたが他の検証スクリプトで一つのパラメータを使用しようとしているということで、PowerShellを呼び出し、解析ではなく、実際の実行に検証を行うために表示されていることを疑います。 $ sourceの検証を関数本体に移すと、それ以上の問題はないでしょう。私はまだこれを試したことはありませんが、私はチャンスを得る時に、その時に確認するようにコメントします。

+0

(OPが実際にこれを試したと仮定して、これが実際に試されていない場合は、今後質問をする前に試してみてください)。 –

0

私が正しく覚えていれば、位置宣言を完全に省略することができ、コマンドラインでパラメータ名(-name)を指定しないと、powershellはそれらを順番に処理します。

[CmdletBinding()] 
Param(
    [string] version, 
    [ValidateScript({ SomeModule/Search(version, $_); $true # FIND THIS VERSION IN SOURCE. **VERSION MUST HAVE BEEN SET BY NOW** })] 
    [string] source, 
) 

この時点で、次は動作するはずです:これは動作するはずです

MyScript.ps1 12345ABC 'filesystem' 

もが:

MyScript.ps1 -source 'filesystem' -version 12345AB 
関連する問題