Pregunta

En PowerShell 1.0, si tengo un parámetro de cmdlet de un tipo de enumeración, ¿cuál es el método recomendado para probar si el usuario especificó ese parámetro en la línea de comandos de cmdlet? Por ejemplo:

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?
}

¿Hay alguna manera de hacer esto sin tener que sembrar si se habilita con un valor ficticio? Por defecto, será igual a 0, y no quiero tener que inicializar todos los parámetros o agregar un valor ficticio a mi enumeración. Potencialmente tengo muchos cmdlets con cientos de parámetros, tiene que haber una mejor manera. Esto está relacionado con esta pregunta pero Estaba buscando una forma más limpia de hacer esto. Gracias.

¿Fue útil?

Solución

En este caso, usaría un envoltorio que pueda contener nulos alrededor del tipo de enumeración, p. ej.

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

¿Nota el? modificador en MyEnum. Entonces puedes probar si está configurado así:

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

Otros consejos

Aparte de PowerShell, nunca es bueno usar el estilo 0 de esa manera. Siempre debe usar 0 para el valor predeterminado más apropiado. En este caso, el valor predeterminado más apropiado debería ser algo como " Unset. & Quot;

En última instancia, esto no tiene nada que ver con PowerShell y con las buenas prácticas de codificación para .NET.

  • Oisin

Como opción, puede utilizar la colección $ PSBoundParameters para comprobar si se pasa al método.

Supongamos que tenemos un archivo json como el siguiente {" p1 " ;: " valor1 " ;, " p2 " ;: " valor2 " } y queremos crear una función que acepte el parámetro p1 y p2 y el valor de actualización de p1 y p2 en el archivo, si se pasan a la función. Digamos que esos valores pueden ser null y tener esos valores como nulos no es equivalente a no pasarlos.

Por ejemplo, Update-Values ??-p1 $ null debería actualizar p1 a null y no debería cambiar p2 .

Para hacerlo, deberíamos poder detectar si el parámetro se ha pasado al método o no.

Ejemplo: ¿Cómo detectar si se pasa un parámetro para un parámetro opcional que puede aceptar 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"
    }
}

Luego, si ejecuta la función utilizando el siguiente parámetro:

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

Como resultado verá:

p1 passed
p2 not passed

Puede leer la publicación del blog aquí: Cómo determinar si un parámetro se pasa a un Cmdlet Powershell .

Lo único que puedo ver es modificar tu enumeración para que el valor 0 se llame Unknown o algo así.

El problema es que las enumeraciones son solo enteros en segundo plano y los enteros son tipos de valor. La consecuencia desafortunada es que necesitan tener valor y ese valor es 0 de forma predeterminada.

Sé que este hilo es un poco viejo ahora, pero la mejor manera de hacerlo es declarar su parámetro usando el tipo SwitchParameter. Entonces sus usuarios no tienen que pasar -IsEnabled, simplemente agregarían algo como -Habilitado como parámetro.

Luego, prueba la propiedad .IsPresent de su parámetro para ver si la persona que llama agregó - Habilitado a la llamada al cmdlet.

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top