我可以在PowerShell函数参数的ValidateSet属性中使用常量吗?
我正在对我的一个PowerShell函数参数使用ValidateSet属性,如下所示:我可以在PowerShell函数参数的ValidateSet属性中使用常量吗?,powershell,Powershell,我正在对我的一个PowerShell函数参数使用ValidateSet属性,如下所示: [ValidateSet('Development','Test','Production')] [string]$Context 我在一个脚本项目的许多地方重复了这一点。这些文字字符串可以替换为常量吗?不,它必须是文字或脚本块。scriptblock选项似乎毫无意义,因为它似乎使用scriptblock的文本(字符串)值,而不是执行它 因此,根据我的测试,您必须使用文本 如果你使用一个动态参数,你可以做到
[ValidateSet('Development','Test','Production')]
[string]$Context
我在一个脚本项目的许多地方重复了这一点。这些文字字符串可以替换为常量吗?不,它必须是文字或脚本块。scriptblock选项似乎毫无意义,因为它似乎使用scriptblock的文本(字符串)值,而不是执行它 因此,根据我的测试,您必须使用文本 如果你使用一个动态参数,你可以做到这一点,但这是一种过分的方式只是为了干燥 如果你试图使用一个变量,它将不起作用(ISE将给你红色的曲线)。帮助文本错误地说它必须是常量,但它的意思是文字 我创建了一个常数:
Set-Variable -Option Constant
而且它仍然不起作用。添加此项可以帮助其他人寻找类似的解决方案。我在寻找一种方法,根据全局哈希表的键验证参数。这就是我最后做的:
$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
我最终用ValidateScript
替换了ValidateSet
,因为我意识到(正如本线程中提到的)ValidateSet中的代码块根本不起作用。可以很容易地使用以下内容来代替根据哈希表的键进行验证
$validParams = @('opt1', 'opt2')
在ValidateScript代码块中
{ $_ -in $validParams }
这就是我认为应该回答这个问题的基本原理。我使用ValidateScript获得了更好的结果。我创建了一个函数IsValidContext。至少我可以将上下文字符串保留在一个位置,并在以后扩展有效字符串列表,而不必太麻烦。param([ValidateScript({IsValidContext$\u})][string]$Context)@MatthewMacFarland是的,但它不会那样完成。@MatthewMacFarland顺便说一句,如果它对其他人有用,您可以添加它作为另一个答案:)Globals应该避免,原因与大多数其他语言相同。但是您可以将它们嵌入脚本块本身。在模块中,您可以使用
$Script:
范围;它在模块的代码中起着“全局”的作用,但不会污染模块之外的范围。还要注意的是,ValidateScript
不会添加制表符完成,当验证失败时,它会有错误输出,这可以通过-或$(抛出“更好的错误消息”)
有所缓解。每天学习一些新东西-不知道脚本的范围,似乎这正是我需要的-谢谢!