Tenho uma função, quero fornecer dinamicamente valores para o parâmetro Name usando uma lista de nomes de arquivo encontrados em c:\names
, para que tab
sempre forneça nomes que sejam UpToDate. Descobri como fazer isso com uma classe, mas quero fazer um tratamento "inteligente" também. Se o usuário fornecer *
ou ?
como um valor, isso também deve ser aceitável. Quero usar essencialmente esses caracteres como "modificadores" para o parâmetro.
O que eu tenho é o seguinte:
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
}}
Com o acima tab
não completa automaticamente nenhum valor para o parâmetro Nome, e às vezes até recebo um erro:
MetadataError: The variable cannot be validated because the value cleanup4 is not a valid value for the Name variable.
Posso fornecer o valor *
para Nome sem problemas, mas não recebo nenhum erro:
fooo -name *
#Modifier Used, do something special insead of the usual thing
Eu sei que posso usar apenas um parâmetro switch aqui, em vez de seguir esse caminho, minha principal preocupação é como adicionar valores adicionais em cima dos valores fornecidos pela ValidNames
classe? Algo como:
...
[ValidateSet([validNames], "foo", "bar", "baz", ErrorMessage = """{0}"" Is not a valid name")]
...
Estou no PWS 7.4
Você não pode combinar a passagem de um
System.Management.Automation.IValidateSetValuesGenerator
tipo -implementing com a enumeração de valores adicionais literalmente em um[ValidateSet()]
atributo. [1]Ou: faça o tipo retornar todos os valores.
Ou: enumere todos os valores diretamente no atributo (construtor), o que não é uma opção se você deseja gerar (alguns dos) valores válidos dinamicamente (como no seu caso).
[1] Esta restrição é implícita pelos dois únicos construtores disponíveis para o dito atributo. Com dois ou mais argumentos, a sobrecarga
ValidateSetAttribute(String[])
é escolhida, o que assume valores válidos literalmente enumerados;[ValidateSet([validNames], "*")
portanto, resulta em apenas dois valores válidos: a versão stringificada do tipo[validvalues]
, ou seja[validvalues].ToString()
, , que produz'validvalues'
, e'*'
.