でカスタム関数を使用することは可能ですか?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)"
これまでのフィードバックから、PowerShellv4では現在私が望んでいることを正確に実行することは不可能のようです。
私はこの目的を達成するために簡単な回避策を使用することになりました。少しオーバーヘッドがかかりますが、それほど苦痛ではありません。
ValidateScript
ファイルのパラメーターから検証を削除しました。RUN
し、ファイルのパラメーターをこの関数のパラメーターとまったく同じようにコピーしました。この関数が呼び出される前であれば、スクリプトのどこにこの関数が表示されるかは関係ありません(手順4を参照)。ValidateScript
この関数の定義にこの部分を追加しました。RUN
すべてのパラメーターを渡すこの新しい関数を呼び出しました(@PSBoundParameters
単純化/メンテナンスの削減のために使用)。process
ブロックに移動しましたRUN
。@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]
コメントを追加