引數驗證

在 PowerShell 中,有多種方法可以驗證引數輸入。

如果傳遞無效值,這些 ParameterAttributes 將丟擲,而不是在函式或指令碼中編寫程式碼來驗證引數值。

ValidateSet

有時我們需要限制引數可以接受的可能值。假設我們只想在指令碼或函式中為 $Color 引數僅允許紅色,綠色和藍色。

我們可以使用 ValidateSet 引數屬性來限制它。它具有在設定此引數時允許選項卡完成的額外好處(在某些環境中)。

param(
    [ValidateSet('red','green','blue',IgnoreCase)]
    [string]$Color
)

你還可以指定 IgnoreCase 以禁用區分大小寫。

ValidateRange

這種引數驗證方法採用最小和最大 Int32 值,並要求引數在該範圍內。

param(
    [ValidateRange(0,120)]
    [Int]$Age
)

ValidatePattern

此引數驗證方法接受與指定的正規表示式模式匹配的引數。

param(
    [ValidatePattern("\w{4-6}\d{2}")]
    [string]$UserName
)

ValidateLength

這種引數驗證方法測試傳遞的字串的長度。

param(
    [ValidateLength(0,15)]
    [String]$PhoneNumber
)

ValidateCount

這種引數驗證方法測試傳入的引數數量,例如,字串陣列。

param(
    [ValidateCount(1,5)]
    [String[]]$ComputerName
)

ValidateScript

最後,ValidateScript 方法非常靈活,使用一個 scriptblock 並使用$ _來表示它,以表示傳遞的引數。然後,如果結果為$ true(包括任何輸出為有效),則傳遞引數。

這可用於測試檔案是否存在:

param(
    [ValidateScript({Test-Path $_})]
    [IO.FileInfo]$Path 
)

要檢查 AD 中是否存在使用者:

param(
    [ValidateScript({Get-ADUser $_})]
    [String]$UserName
)

幾乎任何你能寫的東西(因為它不僅限於 oneliners):

param(
    [ValidateScript({
        $AnHourAgo = (Get-Date).AddHours(-1)
        if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
            $true
        } else {
            throw "That's not within five minutes. Try again."
        }
    })]
    [String]$TimeAboutAnHourAgo
)