Pergunta

Em PowerShell 1.0, se eu tiver um parâmetro cmdlet de um tipo de enumeração, qual é o método recomendado para testar se o usuário especificado esse parâmetro na linha de comando cmdlet? Por exemplo:

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 }

class DoSomethingCommand : PSCmdlet
...
private MyEnum isEnabled;

[Parameter(Mandatory = false)]
public MyEnum IsEnabled
{
    get { return isEnabled; }
    set { isEnabled = value; }
}

protected override void ProcessRecord()
{
    // How do I know if the user passed -IsEnabled <value> to the cmdlet?
}

Existe alguma maneira de fazer isso sem ter que semente isEnabled com um valor fictício? Por padrão, ele será igual a 0, e eu não quero ter que semear cada parâmetro ou adicionar um valor fictício ao meu enum. Eu potencialmente tem muitos cmdlets, com 100 dos parâmetros, não tem que ser uma maneira melhor. Isto está relacionado com esta questão mas eu estava à procura de uma maneira mais limpa de fazer isso. Obrigado.

Foi útil?

Solução

Neste caso, eu usaria um invólucro anulável em torno do tipo de enumeração por exemplo

[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }

Observe o? modificador em MyEnum. Então você pode testar se ela é definida assim:

if (this.IsEnabled.HasValue) { ... }

Outras dicas

PowerShell lado, nunca é bom estilo de usar 0 dessa forma. Você deve sempre usar 0 para o padrão mais adequado. Neste caso, o padrão mais adequado deve ser algo como "Desativar."

Em última análise, isto não é nada a ver com o PowerShell e tudo a ver com as boas práticas de codificação para .NET.

  • Oisin

Como opção, você pode usar $PSBoundParameters coleção para verificar se passado para o método.

Vamos supor que temos um arquivo json como seguir { "p1": "value1", "p2": "value2" } e queremos criar uma função que aceita parâmetro p1 e p2 e valor atualização de p1 e p2 no arquivo, se eles são passados ??para a função. Digamos esses valores podem ser null e e ter esses valores como nulo não é equivalente a não passá-los.

Por exemplo Update-Values -p1 $null deve atualizar p1 para null e não deve mudar p2.

Para fazer isso, devemos ser capazes de detectar se o parâmetro foi passado para o método ou não.

Exemplo -? Como detectar se um parâmetro é passado, para um parâmetro opcional que pode aceitar nulo como valor

Function Update-Values ($p1, $p2) {
    If($PSBoundParameters.ContainsKey("p1")) {
        Write-Host "p1 passed"
    }
    else {
        Write-Host "p1 not passed"
    }
    If($PSBoundParameters.ContainsKey("p2")) {
        Write-Host "p2 passed"
    }
    else {
        Write-Host "p2 not passed"
    }
}

Então, se você executar a função usando o seguinte parâmetro:

Update-Values -p1 $null
# Update-Values -p1 "something"

Como resultado, você verá:

p1 passed
p2 not passed

Você pode ler o post aqui: Como determinar se um parâmetro é passado para um PowerShell cmdlet .

A única coisa que eu posso ver é modificar a sua enumeração de modo que o valor 0 é nomeado desconhecido ou algo parecido.

O problema é que enums são apenas números inteiros no fundo e inteiros são tipos de valor. infeliz consequência é que eles precisam para ter valor e esse valor é 0 por padrão.

Eu sei que esta discussão é um pouco velho agora, mas a melhor maneira de fazer isso é declarar o seu parâmetro usando o tipo SwitchParameter. Em seguida, os usuários não têm que passar -IsEnabled, eles apenas adicionar algo como -Enabled como parâmetro.

Você, então, testar a propriedade .IsPresent do seu parâmetro para ver se o chamador adicionado habilitado para a chamada para o cmdlet.

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top