2017-08-02 25 views
1

我剛剛注意到,如果您在函數中使用參數變量ValidateSet,則不能在該函數內將參數變量更改爲不在該集合中的值。ValidateSet如何停止將變量更改爲非設置值?

下面是一個簡單的例子來說明:

Function Test { 
    [cmdletbinding()] 
    Param(
     [ValidateSet(1,2,3)] 
     [int]$Number 
    ) 

    $Number = 4 
} 

Test 3 

返回:

變量不能驗證,因爲該值4不是Number變量的有效值。

我用Get-Member探索$Number,我看不出它如何(爲什麼)限制變量任何這樣的跡象。我認爲這是某種自定義對象或強打字,但變量看起來是System.Int32。有誰知道這是怎麼發生的?

這並不是唯一的Int變量,這只是一個簡單的例子。我發現對於String Array參數也是如此。

回答

1

我從這個相關的問題發現:Find the values in ValidateSet,如果我做我的函數裏面以下:

(Get-Variable 'Number').Attributes.ValidValues 

此列出定義的ValidateSet值。因此,我假定設置這個屬性是ValidateSet是如何工作的,副作用是它在變量的整個生命週期中都有效。

+0

如果有某個PowerShell wiki,我會強烈建議您將這些信息放在其中! –

+2

FWIW,對於賦值的「強」型約束也是如此,比較'[bool] $ a = $ true;(變量a).Attributes'和'$ b = $ true;(變量b).Attributes' –