Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在PowerShell函数参数的ValidateSet属性中使用常量吗?_Powershell - Fatal编程技术网

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

我可以在PowerShell函数参数的ValidateSet属性中使用常量吗?,powershell,Powershell,我正在对我的一个PowerShell函数参数使用ValidateSet属性,如下所示: [ValidateSet('Development','Test','Production')] [string]$Context 我在一个脚本项目的许多地方重复了这一点。这些文字字符串可以替换为常量吗?不,它必须是文字或脚本块。scriptblock选项似乎毫无意义,因为它似乎使用scriptblock的文本(字符串)值,而不是执行它 因此,根据我的测试,您必须使用文本 如果你使用一个动态参数,你可以做到

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

[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
不会添加制表符完成,当验证失败时,它会有错误输出,这可以通过
-或$(抛出“更好的错误消息”)
有所缓解。每天学习一些新东西-不知道脚本的范围,似乎这正是我需要的-谢谢!