我有一个函数,我想使用
c:\names
中找到的文件名列表动态地为 Name 参数提供值,以便 tab
始终提供最新的名称。我已经弄清楚如何在课堂上做到这一点,但我也想做一些“聪明”的处理。如果用户提供 *
或 ?
作为值,那么这也应该可以接受。我想本质上使用这些字符作为参数的“修饰符”。
以下是我所拥有的:
Function fooo{
Param(
[ValidateSet([validNames], "*", ErrorMessage = """{0}"" Is not a valid name")]
#[ValidateSet([validNames], ErrorMessage = """{0}"" Is not a valid name")] #'tab' works as expected here
[string]$Name
)
if ($name -eq "*"){"Modifier Used, do something special insead of the usual thing"}
$name
}
Class validNames : System.Management.Automation.IValidateSetValuesGenerator{
[string[]] GetValidValues(){
return [string[]] (Get-ChildItem -path 'C:\names' -File).BaseName
}}
使用上面的
tab
不会自动完成Name参数的任何值,有时我什至会收到错误:
MetadataError: The variable cannot be validated because the value cleanup4 is not a valid value for the Name variable.
我可以提供值
*
到 Name 就好,我确实遇到了任何错误:
fooo -name *
#Modifier Used, do something special insead of the usual thing
我知道我可以在这里使用 switch 参数,而不是沿着这条路线走下去,我主要关心的是如何在
ValidNames
类提供的值之上添加附加值?比如:
...
[ValidateSet([validNames], "foo", "bar", "baz", ErrorMessage = """{0}"" Is not a valid name")]
...
我使用的是 PWS 7.4
您可以不将传递
System.Management.Automation.IValidateSetValuesGenerator
实现类型与在[ValidateSet()]
属性中字面枚举附加值结合起来。
要么:使类型返回所有值。
或者:直接在属性中枚举 all 值。