tutorial script learn ise ejemplos ejecutar desde comandos powershell scripting

script - PowerShell: ¿cómo puedo probar el valor de una variable con "Set-StrictMode-version latest"?



powershell scripting tutorial (2)

Acabo de comenzar a hacer algunas secuencias de comandos de PowerShell, y me estoy encontrando con un problema al probar las variables para un valor. Intento ejecutar todo con todas las advertencias habilitadas, especialmente mientras estoy aprendiendo, para captar errores tontos. Entonces, estoy usando CTPV3 y estableciendo el modo estricto con "set-strictmode -version latest". Pero estoy corriendo en un bloque de carreteras con la comprobación de las variables entrantes para un valor. Estas variables pueden o no estar configuradas.

# all FAIL if $var is undefined under "Set-StrictMode -version latest" if ( !$var ) { $var = "new-value"; } if ( $var -eq $null ) { $var = "new-value"; }

No puedo encontrar una manera de comprobar si una variable tiene un valor que no causa advertencias cuando falta la variable a menos que apague el modo estricto. Y no quiero activar y desactivar el modo estricto por todas partes solo para probar las variables. Estoy seguro de que me olvidaré de volver a encenderlo en alguna parte y parece terriblemente abarrotado. Eso no puede ser correcto. ¿Qué me estoy perdiendo?


Realmente estás probando dos cosas aquí, existencia y valor. Y la prueba de existencia es la que causa las advertencias bajo la operación de modo estricto. Entonces, separa las pruebas. Recordando que PowerShell considera las variables como solo otro proveedor (como un archivo o proveedor de registro) y que todas las variables de PowerShell existen como archivos en la carpeta raíz de la unidad llamada ''variable:'', resulta obvio que puede usar el mismo mecanismo que lo usarías normalmente para probar cualquier otra existencia de archivo . Por lo tanto, use ''test-path'':

if (!(test-path variable:/var)) {$var = $null} # test for EXISTENCE & create if ( !$var ) { $var = "new-value"; } # test the VALUE

Tenga en cuenta que el modo estricto actual se puede cambiar en ámbitos secundarios sin afectar el alcance principal (por ejemplo, en bloques de script). Por lo tanto, podría escribir un bloque de script que encapsule la eliminación del modo estricto y la configuración de la variable sin afectar el rigor del programa circundante. Es un poco complicado debido al alcance variable. Dos posibilidades que puedo pensar:

# 1 - devuelve el valor del bloque de script

$var = & { Set-StrictMode -off; switch( $var ) { $null { "new-value" } default { $var } }}

o # 2 - use modificadores de alcance

& { Set-StrictMode -off; if (!$var) { set-variable -scope 1 var "new-value" }}

Probablemente la peor parte de esto sea el uso repetitivo y propenso a errores de $ var (tanto con y sin los $ principales). Parece muy propenso a errores. Entonces, en cambio, usaría una subrutina:

function set-Variable-IfMissingOrNull ($name, $value) { $isMissingOrNull = !(test-path (''variable:''+$name)) -or ((get-variable $name -value) -eq $null) if ($isMissingOrNull) { set-variable -scope 1 $name $value } } set-alias ?? set-Variable-IfMissingOrNull #... ## in use, must not have a leading $ or the shell attempts to read the possibly non-existant $var set-VarIfMissingOrNull var "new-value" ?? varX 1

Este último es probablemente la forma en que lo guioné.

EDITAR: Después de pensar en su pregunta por un tiempo más largo, se me ocurrió una función más simple que se asemeja más a su estilo de codificación. Prueba esta función:

function test-variable {# return $false if variable:/$name is missing or $null param( [string]$name ) $isMissingOrNull = (!(test-path (''variable:''+$name)) -or ((get-variable -name $name -value) -eq $null)) return !$isMissingOrNull } set-alias ?-var test-variable if (!(?-var var)) {$var = "default-value"}

Espero que ayude.


En primer lugar, me encanta la respuesta de Roy, completa y sucinta. Solo quería mencionar que parece que estás tratando de establecer solo una variable si ya se ha establecido. Esto parece un trabajo para variables de solo lectura o constantes.

Para hacer una variable de solo lectura, una constante, use

Set-Variable

De get-help Set-Variable -full

-- ReadOnly: Cannot be deleted or changed without the Force parameter. -- Constant: Cannot be deleted or changed. Constant is valid only when creating a new variable. You cannot set the Constant option on an existing variable.