我可以在PowerShell函数参数的ValidateSet属性中使用常量吗?

Mat*_*and 10 powershell

我在我的一个PowerShell函数参数上使用ValidateSet属性,如下所示:

[ValidateSet('Development','Test','Production')]
[string]$Context
Run Code Online (Sandbox Code Playgroud)

我重复了这一点,在整个脚本项目中有很多地方.这些文字字符串可以用常量替换吗?

bri*_*ist 9

不,它必须是文字或脚本块.scriptblock选项似乎毫无意义,因为它似乎使用scriptblock的文字(字符串)值而不是执行它.

因此,从我的测试中,你必须使用文字.

如果你使用动态参数而不是你可以做到这一点,但这样就过度杀戮了.

如果你尝试使用变量,它将无法工作(ISE会给你红色波浪形).帮助文本错误地说它必须是常量,但它意味着文字.

我创建了一个常量:

Set-Variable -Option Constant
Run Code Online (Sandbox Code Playgroud)

它仍然无法正常工作.

  • @MatthewMacFarland 是的,但它不会以这种方式完成。 (2认同)
  • @MatthewMacFarland 顺便说一句,您可以将其添加为另一个答案,以防对其他人有用:) (2认同)

Ail*_*n79 4

添加此内容是为了帮助其他人寻找类似的解决方案。我正在寻找一种根据全局哈希表的键验证参数的方法。这就是我最终所做的:

$global:MyHash = @{
    "anyitem"  = @{"name" = "somename1"; "count" = 42 };
    "someitem" = @{"name" = "another name"; "count" = 1337 };
}

function Test-Hash
{
    param
    (
        [Parameter(mandatory = $true)] [ValidateScript( { $_ -in $global:MyHash.Keys } )] [string[]] $items
    )
}

Test-Hash -items anyitem, someitem
Run Code Online (Sandbox Code Playgroud)

我最终替换ValidateSet为,ValidateScript因为我意识到(正如本线程中提到的)ValidateSet 中的代码块根本不起作用。相反,可以轻松地使用类似的东西来验证哈希表的键

$validParams = @('opt1', 'opt2')
Run Code Online (Sandbox Code Playgroud)

并在 ValidateScript 代码块中

{ $_ -in $validParams }
Run Code Online (Sandbox Code Playgroud)

这基本上就是我认为应该回答的问题。

  • 出于与大多数其他语言相同的原因,应避免使用全局变量。但您可以将它们嵌入到脚本块本身中。在模块中,您可以使用“$Script:”范围来代替;它在模块代码中的作用类似于“全局”,但不会污染模块外部的范围。另请注意,“ValidateScript”不会添加制表符补全,并且当验证失败时,它会输出错误的错误,这可以通过“-or $(throw "A better error message")”来缓解。 (2认同)