Powershell: todo lo que quería saber sobre la instrucción IF

Al igual que muchos otros lenguajes, PowerShell tiene instrucciones para ejecutar código de forma condicional en sus scripts. Una de esas declaraciones es la declaración if. Hoy vamos a profundizar en uno de los comandos más fundamentales de PowerShell.,

  • Índice
  • ejecución Condicional
  • La instrucción if
  • los operadores de Comparación
    • -eq para la igualdad
      • -ne no es igual
    • -gt -ge -lt -le de mayor que o menor que
    • -como comodín partidos
    • coincidencia de expresión regular
    • -es de tipo
  • Colección operadores
    • contiene
    • en
  • operadores Lógicos
    • -no
      • !,pressions
        • Checking for null null
        • Variable assignment
      • Alternate execution path
        • else
        • anidada if
        • elseif
        • switch
      • Pipeline
        • Array inline
      • Simplify complex operations
        • Line continuation
        • pre-cálculo de resultados
        • múltiples sentencias if
        • usando funciones
      • Manejo de errores
      • palabras finales

      ejecución condicional

      sus scripts a menudo necesitarán tomar decisiones y realizar una lógica diferente basada en esas decisiones., Esto es lo que quiero decir con ejecución condicional. Tiene una instrucción o valor para evaluar, luego ejecute diferentes secciones de código basadas en esa evaluación. Esto es exactamente lo que hace la instrucción if.

      La instrucción if

      Aquí es un ejemplo muy básico de la etiqueta if instrucción:

       $condition = $true if ( $condition ) { Write-Output "The condition was true" }

      La primera cosa que el if declaración que hace es evaluar la expresión en paréntesis., Si evalúa a $true, entonces se ejecuta el scriptblock en las llaves. Si el valor era $false, entonces saltaría ese bloque de scripts.

      en el ejemplo anterior, la instrucción if estaba evaluando la variable $condition. Era de $true y habría ejecutado el Write-Output comando dentro del bloque script.

      en algunos idiomas, puede colocar una sola línea de código después de la instrucción if y se ejecutará., Este no es el caso en PowerShell. Debe proporcionar un scriptblock completo con Llaves para que funcione correctamente.

      operadores de comparación

      lo más común para lo que usarás la instrucción if es comparar dos elementos entre sí. Powershell tiene operadores especiales para diferentes escenarios de comparación. Cuando se utiliza un operador de comparación, el valor del lado izquierdo se compara con el valor del lado derecho.,

      -eq para Igualdad

      el -eq hace una comprobación de igualdad entre dos valores para asegurarse de que son iguales entre sí.

       $value = Get-MysteryValue if ( 5 -eq $value ) { # do something }

      En este ejemplo, estoy tomando un valor conocido de 5 y comparando mi $value para ver si coinciden.

      un posible caso de uso es comprobar el estado de un valor antes de realizar una acción sobre él. Puede obtener un servicio y comprobar que el estado se estaba ejecutando antes de llamar a Restart-Service en él.,

      es común en otros lenguajes como C# usar ==para la igualdad (por ejemplo: 5 == $value), pero eso no funciona con powershell. Otro error común que la gente comete es usar el signo igual (por ejemplo: 5 = $value) que está reservado para asignar valores a variables. Al colocar su valor conocido a la izquierda, hace que ese error sea más incómodo de hacer.

      este operador (y otros) tienen algunas variaciones.,

      • -eq igualdad insensible a mayúsculas y minúsculas
      • -ieq igualdad insensible a mayúsculas y minúsculas
      • -ceq igualdad p> muchos operadores tienen un operador relacionado que está comprobando el resultado opuesto. -ne verificará que los valores no sean iguales entre sí.

         if ( 5 -ne $value ) { # do something }

        el Uso de esto para asegurarse de que la acción sólo se ejecuta si el valor no es 5., Un buen uso-casos donde sería comprobar si un servicio estaba en el estado de ejecución antes de intentar e iniciarlo.

        variaciones:

        • -ne case insensitive not equal
        • -ine case insensitive not equal
        • -cne case sensitive not equal

        son solo variaciones inversas de-eq. Agruparé estos tipos cuando enumere variaciones para otros operadores.,

        -gt -ge -lt -le de mayor que o menor que

        Estos operadores se utilizan cuando comprueba si un valor es mayor o menor que otro valor. El -gt -ge -lt -le significa GreaterThan, GreaterThanOrEqual, LessThan y LessThanOrEqual.,eater than or equal, case insensitive

      • -cge greater than or equal, case sensitive
      • -lt less than
      • -ilt less than, case insensitive
      • -clt less than, case sensitive
      • -le less than or equal
      • -ile less than or equal, case insensitive
      • -cle less than o igual, sensible a mayúsculas y minúsculas

      no se por qué utilizarías las opciones sensibles a mayúsculas y minúsculas para estos operadores.,

      -como coincidencias de comodines

      PowerShell tiene su propia sintaxis de coincidencia de patrones basada en comodines y puede usarla con el operador -like. Estos patrones comodín son bastante básicos.

      • ? coincidirá con cualquier carácter
      • * coincide con cualquier número de caracteres
       $value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }

      Es importante señalar que el patrón coincide con la cadena entera., Si necesita hacer coincidir algo en el medio de la cadena, entonces necesitará colocar el * en ambos extremos de la cadena.,iv>

Variaciones:

  • -like mayúsculas y minúsculas comodín
  • -ilike mayúsculas y minúsculas comodín
  • -clike mayúsculas de minúsculas comodín
  • -notlike mayúsculas y minúsculas comodín no coincide
  • -inotlike mayúsculas y minúsculas comodín no coincide
  • -cnotlike mayúsculas de minúsculas comodín no coincide

coincidencia de expresión regular

El -match operador le permite comprobar una cadena para una expresión regular basado partido., Utilice esto cuando los patrones comodín no son lo suficientemente flexibles para usted.

 $value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }

Una expresión regular de patrón coincidirá con alguna parte de la cadena por defecto. Así que usted puede especificar una subcadena que desea igualado como este:

 $value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }

Regex es un complejo lenguaje propio y que vale la pena considerar. Hablo más sobre -match y las muchas formas de usar expresiones regulares en otro artículo.,

Variations:

  • -match case insensitive regex
  • -imatch case insensitive regex
  • -cmatch case sensitive regex
  • -notmatch case insensitive regex not matched
  • -inotmatch case insensitive regex not matched
  • -cnotmatch case sensitive regex not matched

-is of type

You are able to check a value’s type with the -is operator.,

 if ( $value -is ) { # do something }

puede usar esto si está trabajando con clases o aceptando varios objetos en la canalización. Usted podría tener un servicio o un nombre de servicio como su entrada. Luego verifique si tiene un servicio y obtenga el servicio si solo tiene el nombre.,

 if ( $Service -isnot ) { $Service = Get-Service -Name $Service }

Variaciones:

  • -is tipo
  • -isnot no de tipo

de la Colección de los operadores

Cuando se utiliza el anterior operadores con un único valor, el resultado es $true o $false. Esto se maneja de manera ligeramente diferente cuando se trabaja con una colección. Cada elemento de la colección se evalúa y el operador devolverá en su lugar cada valor que se evalúa como $true.,

 PS> 1,2,3,4 -eq 3 3

Esto todavía funciona correctamente en un if declaración. Así que un valor es devuelto por su operador, entonces toda la instrucción es $true.

 $array = 1..6 if ( $array -gt 3 ) { # do something }

Hay una pequeña trampa esconde en los detalles aquí que yo necesito señalar. Al usar el operador -ne de esta manera, es fácil mirar erróneamente la lógica hacia atrás., El uso de -ne con una colección devolverá $true si algún elemento de la colección no coincide con su valor.

 PS> 1,2,3 -ne 4 1 2 3

Esto puede parecer un truco, pero tenemos los operadores -contains y -in que se dedican a esto de manera más eficiente y -notcontains correctamente hacer lo que usted espera.

– contiene

el operador-contains comprobará el valor de la colección., Tan pronto como encuentre una coincidencia, devolverá $true.

 $array = 1..6 if ( $array -contains 3 ) { # do something }

Esta es la forma preferida para ver si la colección contiene su valor. Usar Where-Object ( o -eq) recorrerá toda la lista cada vez y será significativamente más lento.,

Variations:

  • -contains case insensitive match
  • -icontains case insensitive match
  • -ccontains case sensitive match
  • -notcontains case insensitive not matched
  • -inotcontains case insensitive not matched
  • -cnotcontains case sensitive not matched

-in

The es igual que el operador -contains excepto que la colección está en el lado derecho.,

 $array = 1..6 if ( 3 -in $array ) { # do something }

Variations:

  • -in case insensitive match
  • -iin case insensitive match
  • -cin case sensitive match
  • -notin case insensitive not matched
  • -inotin case insensitive not matched
  • -cnotin case sensitive not matched

Logical operators

Logical operators are used to invert or combine other expressions.,

-no

El -not operador invierte una expresión de $false a $true o de $true a $false. Este es un ejemplo donde queremos realizar una acción cuando Test-Path es $false.

 if ( -not ( Test-Path -Path $path ) )

la Mayoría de los operadores hablamos de hacer una variación a donde usted no necesita usar la etiqueta -not operador, pero todavía hay veces que podría utilizarlo.

!,

puede utilizar ! como un alias para -not.

 if ( -not $value ){} if ( !$value ){}

Usted verá ! más utilizado por las personas que vienen de otro de los lenguajes de programación como C#. Prefiero escribirlo porque me resulta difícil ver cuando miro rápidamente mis scripts.

– y

puede combinar expresiones con el operador -and. Cuando haces eso, ambos lados deben ser $true para el conjunto de la expresión $true.,

 if ( ($age -gt 13) -and ($age -lt 55) )

En este ejemplo, $age deben ser mayores de 13 años para el lado izquierdo y a menos de 55 para el lado derecho. Agregué paréntesis adicionales para que quede más claro en ese ejemplo, pero son opcionales siempre y cuando la expresión sea simple. Aquí está el mismo ejemplo sin ellos.

 if ( $age -gt 13 -and $age -lt 55 )

la Evaluación se realiza de izquierda a derecha. Si el primer elemento se evalúa como $false, entonces saldrá temprano y no realizará la comparación correcta., Esto es útil cuando necesita asegurarse de que existe un valor antes de usarlo. Test-Path por ejemplo, lanzará un error si le das una ruta $null.

 if ( $null -ne $path -and (Test-Path -Path $path) )

o

El -or permite especificar dos expresiones y devuelve $true si uno de ellos es $true.

 if ( $age -le 13 -or $age -ge 55 )

al igual que con la etiqueta -and operador, la evaluación pasa de izquierda a derecha., Excepto que si la primera parte es $true, entonces la instrucción completa es $true y no procesará el resto de la expresión.

también tome nota de cómo funciona la sintaxis para estos operadores. Necesitas dos expresiones separadas. He visto a los usuarios intentar hacer algo como esto $value -eq 5 -or 6 sin darse cuenta de su error.

– exclusivo de xor o

Este es un poco inusual. -xorsolo permite evaluar una expresión a $true., Así que si ambos elementos $false o ambos elementos $true, entonces toda la expresión es de $false. Otra forma de ver esto es que la expresión es solo $true cuando los resultados de la expresión son diferentes.

es raro que alguien use este operador lógico y no se me ocurre un buen ejemplo de por qué lo usaría.

operadores Bitwise

los operadores Bitwise realizan cálculos en los bits dentro de los valores y producen un nuevo valor como resultado., Enseñar operadores bitwise está más allá del alcance de este artículo, pero aquí está la lista de ellos.

  • -band binary and
  • -bor binary OR
  • -bxor binary exclusive OR
  • -bnot binary not
  • -shl shift left
  • -shr shift right

expresiones de PowerShell

podemos usar PowerShell normal dentro de la sentencia condition.,

 if ( Test-Path -Path $Path )
Test-Path devuelve $true o $false cuando se ejecuta. Esto también se aplica a los comandos que devuelven otros valores.

 if ( Get-Process Notepad* )

Se evaluará a $true si hay una devolución de proceso y de $false si no hay nada., Es perfectamente válido usar expresiones de canalización u otras instrucciones de PowerShell como esta:

 if ( Get-Process | Where Name -eq Notepad )

estas expresiones se pueden combinar entre sí con los operadores -and y -or, pero usar paréntesis para dividirlos en subexpresiones.

 if ( (Get-Process) -and (Get-Service) )

Comprobación para $null

Tener un resultado o de un $null valor se evalúa a $false en el if declaración., Al verificar específicamente $null, es una buena práctica colocar el $null en el lado izquierdo.

 if ( $null -eq $value )

Hay un par de matices cuando se trata con la etiqueta $null valores en PowerShell. Si estás interesado en bucear más profundo, tengo un artículo sobre todo lo que querías saber sobre null null.

asignación de variables

casi me olvidé de agregar esta hasta que Prasoon Karunan V me lo recordó.,

normalmente, cuando se asigna un valor a una variable, el valor no se pasa a la canalización o consola. Cuando realiza una asignación de variable en una subexpresión, se pasa a la canalización.

 PS> $first = 1 PS> ($second = 2) 2

Ver cómo el $first asignación no tiene salida y la de $second asignación de qué? Cuando se realiza una asignación en una instrucción if, se ejecutará igual que la asignación $second anterior., Aquí es un lugar limpio ejemplo de cómo se podría utilizar es:

 if ( $process = Get-Process Notepad* ) { $process | Stop-Process }

Si $process se les asigna un valor, a continuación, la declaración será $true y el $process detenidos.

asegúrese de no confundir esto con -eq porque esto no es una comprobación de igualdad. Esta es una característica más oscura que la mayoría de la gente no se da cuenta de que funciona de esta manera.,

ruta de ejecución alternativa

la instrucciónifle permite especificar una acción no solo para cuando la instrucción es$true, sino también para cuando es$false. Aquí es donde entra en juego la instrucción else.

else

El else declaración es siempre la última parte de la etiqueta if cuando se lo utiliza.

en este ejemplo, comprobamos el $path para asegurarnos de que es un archivo. Si encontramos el archivo, lo movemos. Si no, escribimos una advertencia., Este tipo de lógica de ramificación es muy común.

anidadas si

las instruccionesif yelse toman un bloque de script, por lo que podemos colocar cualquier comando de PowerShell dentro de ellas, incluyendo otra instrucciónif. Esto le permite hacer uso de la lógica mucho más complicada.

en este ejemplo, primero probamos el camino feliz y luego tomamos medidas al respecto. Si eso falla, hacemos otra comprobación y para proporcionar información más detallada al usuario.

elseif

no estamos limitados a una sola comprobación condicional., Podemos encadenar instrucciones if y else en lugar de anidarlas usando la instrucción elseif.

la ejecución ocurre de arriba a abajo. La instrucción top if se evalúa primero. Si que es $false, se mueve hacia abajo a la siguiente elseif o else en la lista. Ese último else es la acción predeterminada a tomar si ninguno de los otros devuelve $true.,

switch

en este punto, necesito mencionar la instrucción switch. Proporciona una sintaxis alternativa para hacer comparaciones múltiples con un valor. Con el switch, se especifica una expresión y ese resultado se compara con varios valores diferentes. Si uno de esos valores mach, entonces se ejecuta el bloque de código correspondiente. Echa un vistazo a este ejemplo:

 $itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }

Hay tres posibles valores que puede coincidir con la etiqueta $itemType., En este caso, coincidirá con la etiqueta Role y el is a role sería ejecutar. Usé un ejemplo muy simple solo para darle un poco de exposición al operador switch. Hablo más sobre todo lo que siempre quisiste saber sobre la declaración switch en otro artículo.

Pipeline

la pipeline es una característica única e importante de PowerShell. Cualquier valor que no esté suprimido o asignado a una variable se coloca en la canalización., El if nos proporciona una forma de aprovechar la canalización de una manera que no siempre es obvia.

 $discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }

cada bloque de script coloca los resultados de los comandos o el valor en la canalización. Luego estamos asignando el resultado de la instrucción if a la variable $discount. Ese ejemplo podría haber asignado fácilmente esos valores a la variable $discount directamente en cada bloque de scripts., No puedo decir que use esto con la instrucción if muy a menudo, pero tengo un ejemplo donde he usado esto recientemente.

Array inline

Tengo una función llamada Invoke-SnowSql que lanza un ejecutable con varios argumentos de línea de comandos. Aquí hay un clip de esa función donde construyo la matriz de argumentos.

las variables $Debug y $Path son parámetros de la función que proporciona el usuario final. Los evalúo en línea dentro de la inicialización de mi matriz., Si $Debuges true, entonces esos valores caen en el $snowSqlParam en el lugar correcto. Lo mismo se aplica a la variable $Path.

simplificar operaciones complejas

es inevitable que se encuentre en una situación que tiene demasiadas comparaciones para verificar y su instrucción if se desplaza fuera del lado derecho de la pantalla.

pueden ser difíciles de leer y que te hacen más propenso a cometer errores. Hay algunas cosas que podemos hacer al respecto.,

continuación de línea

Hay algunos operadores en PowerShell que le permiten ajustar el comando a la siguiente línea. Los operadores lógicos -andy -or son buenos operadores para usar si desea dividir su expresión en varias líneas.

todavía hay mucho que hacer allí, pero colocar cada pieza en su propia línea hace una gran diferencia. Generalmente solo hago esto Cuando obtengo más de dos comparaciones o si tengo que desplazarme hacia la derecha para leer cualquiera de los lígicos.,

pre-cálculo de resultados

podemos tomar esa sentencia de la sentencia if y solo comprobar el resultado.

esto se siente mucho más limpio que el ejemplo anterior. También se le da la oportunidad de utilizar un nombre de variable que explica qué es lo que realmente está comprobando. Este es también un ejemplo de código de auto-documentación que guarda comentarios innecesarios.

múltiples sentencias if

podemos dividir esto en varias sentencias y verificarlas una a la vez. En este caso usaremos una bandera o una variable de seguimiento para combinar los resultados.,

tuve que invertir la lógica para que la lógica de la bandera funcionara correctamente. Cada evaluación es una declaración individual if. La ventaja de esto es que cuando se está depurando, se puede decir exactamente lo que la lógica está haciendo. Pude agregar mucho mejor verbosidad al mismo tiempo.

La desventaja obvia es que es mucho más código para escribir. El código es más complejo de observar, ya que toma una sola línea de lógica y la explota en 25 o más líneas.

usando functions

También podemos mover toda esa lógica de validación a una función., Mira lo limpio que se ve de un vistazo.

 if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }

Usted todavía tiene que crear la función para realizar la validación, pero lo que hace este código mucho más fácil trabajar con. Hace que este código sea más fácil de probar. En sus pruebas, puede simular la llamada a Test-ADDriveConfiguration y solo necesita dos pruebas para esta función. Uno donde devuelve $true y otro donde devuelve $false. Probar la otra función será más simple porque es tan pequeña.,

el cuerpo de esa función todavía podría ser el de un liner con el que empezamos o la lógica explotada que usamos en la última sección. Esto funciona bien para ambos escenarios y le permite cambiar fácilmente esa implementación más adelante.

manejo de errores

un uso realmente importante de la instrucciónif es verificar las condiciones de error antes de que se produzcan errores. Un buen ejemplo es comprobar si una carpeta ya existe antes de intentar crearla.,

 if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }

me gustaría decir que si usted espera una excepción a suceder, entonces no es realmente una excepción. Así que compruebe sus valores y valide sus condiciones donde pueda.

si desea sumergirse un poco más en el manejo real de excepciones, tengo un artículo sobre todo lo que siempre quiso saber sobre las excepciones.

palabras finales

la instrucciónif es una instrucción simple, pero es una pieza fundamental de PowerShell. Te encontrarás usando esto varias veces en casi todos los scripts que escribas., Espero que tengas una mejor comprensión que la que tenías antes.

Share

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *