スクリプトの後半で定義されたカスタム関数でValidateScriptを使用する

JohnLBevan

でカスタム関数を使用することは可能ですか?ValidateScript関数はスクリプトの後半で定義されます。さらに、この関数を呼び出すときに他のパラメーターを参照することは可能ですか(つまり、循環依存関係がないと仮定します)?

これが不可能な理由は理解していますが、MSが特別なルールを実装して、パラメーターの検証が行われる前にスクリプトを読み取って関数定義を使用できるようにしたいと考えています。

例えば

#Run-DemoScript.ps1
param (
    [Parameter(Mandatory = $true)]
    [string]$DbInstance 
    ,
    [Parameter(Mandatory = $true)]
    [string]$DbCatalog 
    ,
    [Parameter(Mandatory = $true)]

    #
    # Is this possible; i.e.
    # - Validate-Country is not defined until later in this script
    # - DbInstance and DbCatalog parameters are defined alongside Country
    [ValidateScript({Validate-Country -Country $_ -DbInstance $DbInstance -DbCatalog $DbCatalog})] 
    #


    [string]$Country
)

#returns $true if the country is in the database's country table; otherwise false
function Validate-Country {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$DbInstance
        ,
        [Parameter(Mandatory = $true)]
        [string]$DbCatalog
        ,
        [Parameter(Mandatory = $true)]
        [string]$Country
    )
    process {
        $Country = $Country -replace "'","''"
        ((Execute-SQLQuery -DbInstance $DbInstance -DbCatalog $DbCatalog -Query "select top 1 1 x from dbo.Country where Name = '$Country'") | Measure-Object | Select -ExpandProperty Count) -gt 0
    }
}

function Execute-SQLQuery {
    #...
}

"Script ran with Country $Country"

更新

関数定義全体をValidateScript属性に移動しても、スクリプトの後半でその関数にアクセスできるようです。例えば:

param(
    [Parameter(Mandatory = $true)]
    [ValidateScript({
        function IsValid ($test) {
            $test -eq 'test'
        }
        IsValid $_
    })]
    [string]$x
)


"Output: $x"
"Is Valid? $(IsValid $x)"

しかし、それはかなり苦痛です。また、兄弟パラメーターの参照も許可されていません(例:以下)

param(
    [Parameter(Mandatory = $true)]
    [string]$y
    ,
    [Parameter(Mandatory = $true)]
    [ValidateScript({
        function IsValid ($a,$b) {
            $a -eq $b
        }
        IsValid $_, $y
    })]
    [string]$x 
)


"X: $x"
"Y: $Y"
"Is Valid? $(IsValid $x $y)"
JohnLBevan

これまでのフィードバックから、PowerShellv4では現在私が望んでいることを正確に実行することは不可能のようです。

私はこの目的を達成するために簡単な回避策を使用することになりました。少しオーバーヘッドがかかりますが、それほど苦痛ではありません。

  1. ValidateScriptファイルのパラメーターから検証を削除しました
  2. 新しい関数、を作成RUNし、ファイルのパラメーターをこの関数のパラメーターとまったく同じようにコピーしました。この関数が呼び出される前であれば、スクリプトのどこにこの関数が表示されるかは関係ありません(手順4を参照)。
  3. ValidateScriptこの関数の定義にこの部分を追加しました
  4. スクリプトの最後の行として、RUNすべてのパラメーターを渡すこの新しい関数を呼び出しました@PSBoundParameters単純化/メンテナンスの削減のために使用)。
  5. メインファイルに配置されている可能性のある他のすべてのスクリプトロジック(関数定義を除く)を関数のprocessブロックに移動しましたRUN
  6. 落とし穴に注意してください。デフォルトのパラメータを使用する場合は、これらを処理する必要があります。デフォルトでは@PSBoundParameters、手順4の説明には含まれていません。詳細については、「PsBoundParametersにないデフォルト値のパラメータ」を参照してくださいデフォルトロジックを他のパラメータ情報とともに関数定義にコピーする場合、これは問題ではありません。

#Run-DemoScript.ps1
param (
    [Parameter(Mandatory = $true)]
    [string]$DbInstance 
    ,
    [Parameter(Mandatory = $true)]
    [string]$DbCatalog 
    ,
    [Parameter(Mandatory = $true)]
    #[ValidateScript({Validate-Country -Country $_ -DbInstance $DbInstance -DbCatalog $DbCatalog})] 
    [string]$Country
)

#move all logic from main script into here
#copy parameters from file's param definition, only add in validation
function RUN {
    param (
        [Parameter(Mandatory = $true)]
        [string]$DbInstance 
        ,
        [Parameter(Mandatory = $true)]
        [string]$DbCatalog 
        ,
        [Parameter(Mandatory = $true)]
        [ValidateScript({Validate-Country -Country $_ -DbInstance $DbInstance -DbCatalog $DbCatalog})] 
        [string]$Country
    )
    process {
        "Script ran with Country $Country"
    }
}

#returns $true if the country is in the database's country table; otherwise false
function Validate-Country {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$DbInstance
        ,
        [Parameter(Mandatory = $true)]
        [string]$DbCatalog
        ,
        [Parameter(Mandatory = $true)]
        [string]$Country
    )
    process {
        $Country = $Country -replace "'","''"
        ((Execute-SQLQuery -DbInstance $DbInstance -DbCatalog $DbCatalog -Query "select top 1 1 x from dbo.Country where Name = '$Country'") | Measure-Object | Select -ExpandProperty Count) -gt 0
    }
}

function Execute-SQLQuery {
    #...
}

RUN @PSBoundParameters #remember to handle default parameters: https://stackoverflow.com/questions/2808973/parameters-with-default-value-not-in-psboundparameters

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

後で定義されたスクリプト(python)で定義された入力を使用する方法は?

分類Dev

bashスクリプト関数で定義された変数でcurlPOSTを使用する

分類Dev

ある関数で定義されたリストを別の関数で使用する。Python 2.7

分類Dev

別のスクリプトで定義された列挙型を使用する

分類Dev

Javaの「評価」メソッドを使用してGroovyスクリプトで定義された関数を使用する方法

分類Dev

他のイベントリスナー関数で定義されたポップアップを削除する

分類Dev

Rの文字列条件で外部定義された値を使用するカスタム関数を構築する方法

分類Dev

カスタムUIライブラリで定義されたクラスにスタイルを追加する

分類Dev

WinDbgの別のスクリプトで定義されたJavaScript関数を参照するにはどうすればよいですか?

分類Dev

カスタムスクリプト関数(Google Sheets + GAS)でARRAYFORMULAを使用する

分類Dev

Luaのスクリプトで定義されている関数を使用せずに関数を実行する方法

分類Dev

Sparkインタープリターを備えたZeppelinは、クラス/関数定義の外部で宣言されたインポートを無視します

分類Dev

文字列のリストで定義された長さのループで関数を実行します

分類Dev

bashスクリプトから.bashrcで定義された環境変数を使用する

分類Dev

Androidgradleビルドスクリプトで独自のカスタムMavenリポジトリを定義する

分類Dev

「ソース」スクリプトで定義された関数を一覧表示しますか?

分類Dev

関数内でクラスを作成し、それを含む関数のスコープで定義された関数にアクセスする

分類Dev

ACFで更新/作成されたカスタム投稿タイプの後にWordpressで関数を呼び出す

分類Dev

PHP:関数スコープ内で定義されたすべての変数をクエリします

分類Dev

ある関数で定義され、他のタイプスクリプトでは定義されていない変数

分類Dev

再帰的に定義されたカスタムタイプの個別のオブジェクトの数をカウントする慣用的な方法

分類Dev

すべてのPHPスクリプトでカスタム関数を使用できるようにするにはどうすればよいですか?

分類Dev

引数でベクトル化されていないカスタム関数でforループの代わりにlapply関数を使用する方法

分類Dev

クロスフィルターのreductioでカスタム関数を事前定義された関数と混合する

分類Dev

evalで定義された関数をエクスポートする方法は?

分類Dev

ループバックAPIでカスタム関数を定義する最良の方法

分類Dev

phpヘッダーでカスタム定義された変数を使用する

分類Dev

composer.jsonで定義されたComposerスクリプトを使用して、phpunitの色を表示する方法は?

分類Dev

Invoke-Commandを実行した後、スクリプトブロックで定義された変数にアクセスする

Related 関連記事

  1. 1

    後で定義されたスクリプト(python)で定義された入力を使用する方法は?

  2. 2

    bashスクリプト関数で定義された変数でcurlPOSTを使用する

  3. 3

    ある関数で定義されたリストを別の関数で使用する。Python 2.7

  4. 4

    別のスクリプトで定義された列挙型を使用する

  5. 5

    Javaの「評価」メソッドを使用してGroovyスクリプトで定義された関数を使用する方法

  6. 6

    他のイベントリスナー関数で定義されたポップアップを削除する

  7. 7

    Rの文字列条件で外部定義された値を使用するカスタム関数を構築する方法

  8. 8

    カスタムUIライブラリで定義されたクラスにスタイルを追加する

  9. 9

    WinDbgの別のスクリプトで定義されたJavaScript関数を参照するにはどうすればよいですか?

  10. 10

    カスタムスクリプト関数(Google Sheets + GAS)でARRAYFORMULAを使用する

  11. 11

    Luaのスクリプトで定義されている関数を使用せずに関数を実行する方法

  12. 12

    Sparkインタープリターを備えたZeppelinは、クラス/関数定義の外部で宣言されたインポートを無視します

  13. 13

    文字列のリストで定義された長さのループで関数を実行します

  14. 14

    bashスクリプトから.bashrcで定義された環境変数を使用する

  15. 15

    Androidgradleビルドスクリプトで独自のカスタムMavenリポジトリを定義する

  16. 16

    「ソース」スクリプトで定義された関数を一覧表示しますか?

  17. 17

    関数内でクラスを作成し、それを含む関数のスコープで定義された関数にアクセスする

  18. 18

    ACFで更新/作成されたカスタム投稿タイプの後にWordpressで関数を呼び出す

  19. 19

    PHP:関数スコープ内で定義されたすべての変数をクエリします

  20. 20

    ある関数で定義され、他のタイプスクリプトでは定義されていない変数

  21. 21

    再帰的に定義されたカスタムタイプの個別のオブジェクトの数をカウントする慣用的な方法

  22. 22

    すべてのPHPスクリプトでカスタム関数を使用できるようにするにはどうすればよいですか?

  23. 23

    引数でベクトル化されていないカスタム関数でforループの代わりにlapply関数を使用する方法

  24. 24

    クロスフィルターのreductioでカスタム関数を事前定義された関数と混合する

  25. 25

    evalで定義された関数をエクスポートする方法は?

  26. 26

    ループバックAPIでカスタム関数を定義する最良の方法

  27. 27

    phpヘッダーでカスタム定義された変数を使用する

  28. 28

    composer.jsonで定義されたComposerスクリプトを使用して、phpunitの色を表示する方法は?

  29. 29

    Invoke-Commandを実行した後、スクリプトブロックで定義された変数にアクセスする

ホットタグ

アーカイブ