是否可以使用自定義函數和ValidateScript
,其中函數稍後在腳本中定義。 此外,調用此函數時是否可以引用其他參數(即假設沒有循環依賴)?將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)"
我確定這已經發生在你身上了,但爲什麼不只是讓'Validate-Country'早些時候在另一個「主」腳本中找到?儘管爲了保持這一點,我完全理解你的請求的必要性。 – Matt
謝謝@Matt;是的,這是一個好的解決方案;我只是希望將腳本保存到一個單獨的文件中,以便使用較少的技術能力(即不必提供將腳本放在相同路徑中的說明)輕鬆共享和使用腳本。 – JohnLBevan
我明白。不要分心你的實際問題,但你可以有一個主腳本調用你的遠程腳本或在本地複製它們,但這確實增加了不必要的複雜程度。 – Matt