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:
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.,
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
.,
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.
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. -xor
solo 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.
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ónif
le 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 $Debug
es 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 -and
y -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.