2017-08-02 69 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' –