我有一个函数,我想使用在 中找到的文件名列表动态地为 Name 参数提供值c:\names
,以便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
-implementing 类型与在属性中逐字枚举附加值结合起来[ValidateSet()]
。[1]或者:使类型返回所有值。
或者:直接在属性(构造函数)中枚举所有值,如果您想动态生成(部分)有效值(例如在您的情况下),这不是一个选项。
[1] 此约束由该属性仅有两个可用的构造函数所暗示。如果有两个或更多参数,
ValidateSetAttribute(String[])
则选择重载,它假定字面上枚举的有效值;[ValidateSet([validNames], "*")
因此只会产生两个有效值:类型的字符串化[validvalues]
版本,即[validvalues].ToString()
,会产生'validvalues'
,和'*'
。