Operadores
Introducción
Existen numerosos tipos de operadores. Pero ya sean aritméticos, binarios, lógicos u otros, todos permiten actuar sobre las variables. Tenga presente que conocer y dominar los diferentes operadores resulta esencial en la elaboración de un buen script.
1. Operadores aritméticos
En lo que respecta a los operadores aritméticos, PowerShell trata las expresiones de izquierda a derecha respetando las reglas matemáticas así como los paréntesis.
Ejemplo
PS > 2+4*3
14
PS > (2+4)*3
18
La lista de operadores aritméticos disponibles es la siguiente:
Símbolo |
Significado |
+ |
Suma |
- |
Resta |
* |
Multiplicación |
/ |
División |
% |
Módulo |
Los cuatro primeros operadores deben lógicamente resultarle familiares. En cuanto al último, el operador módulo devuelve el resto de la división entera de a entre b.
Por ejemplo, tecleando 5%3 en la consola, obtendremos 2. Simplemente porque en 5 tenemos 1 veces 3 y el resto de la división vale 2.
Constatará que las operaciones aritméticas se aplican también a las variables. Así, $var1 + $var2 le devolverá la suma de las dos variables si contienen valores numéricos. En el caso de un tipo cadena, el operador + tendrá como resultado concatenar el contenido de ambas variables.
Ejemplo del operador + sobre dos enteros
PS > $int1 = 10
PS > $int2 = 13 ...
Operadores de comparación
Con un nombre tan evocador, resulta inútil precisar que los operadores de comparación permiten comparar los datos entre ellos. A diferencia de otros lenguajes, PowerShell utiliza los mismos operadores ya sea para comparar números, cadenas de caracteres, así como para efectuar búsquedas de elementos en un array.
Vea el conjunto de operadores de comparación:
Operador |
Significado |
-eq |
Igual |
-ne |
No igual (distinto) |
-gt |
Estrictamente superior |
-ge |
Superior o igual |
-lt |
Estrictamente inferior |
-le |
Inferior o igual |
Importante: debe conocer una pequeña sutilidad del lenguaje que hace que los operadores no tengan el mismo comportamiento cuando se aplican a un valor escalar o a un array. En efecto, aplicados a un escalar, los operadores devuelven un valor booleano, lo que nos es cierto en el caso de un array.
1. Comparación sobre escalares
Un valor escalar es un valor atómico, como puede ser un número, un carácter o una cadena de caracteres. Generalmente se oponen los arrays a los valores escalares. Habitualmente (pero no siempre) los arrays contienen valores escalares.
Ejemplos
Operaciones sobre cadenas |
Operaciones sobre números |
PS > ’A’ -eq ’a’ True |
PS > 1 -lt 2 True |
PS > ’A’ -ceq ’a’ False |
PS > 2 -lt 1 False |
PS > ’A’ -ceq ’A’ True |
PS > 2 -gt 1 True |
PS > ’PowerShell’... |
Operadores de comparación genéricos
Una expresión genérica es una expresión que contiene un carácter llamado «genérico». Por ejemplo, el asterisco (*) reemplaza cualquier secuencia de caracteres y el signo de interrogación (?) solo substituye un único carácter.
Como los operadores de comparación anteriores, los operadores genéricos no devuelven el mismo tipo de dato en función de si se aplican a un valor escalar o un array.
Existen dos operadores de comparación que permiten comparar una cadena con una expresión genérica.
Operador |
Significado |
-like |
Comparación de igualdad de expresiones genéricas. |
-notlike |
Comparación de desigualdad de expresiones genéricas. |
Para entender mejor el uso de estos operadores, le presentamos algunos ejemplos de aplicación:
# Operaciones sobre escalares
PS > 'Powershell' -like '*shell'
True
PS > 'powershell' -like 'power*'
True
PS > 'Powershell' -clike 'p*shell'
False
PS > 'powershell' -like '*war*'
False
PS > 'powershell' -like '*wer*'
True
PS > 'powershell' -like 'po?er*'
True ...
Operador de comparación de expresiones regulares
Las expresiones regulares (regex) son bien conocidas por los administradores de sistemas Unix/Linux, pero generalmente mucho menos conocidas por los administradores Windows. La razón viene del hecho de que los primeros están acostumbrados a manipular texto con herramientas por línea de comandos como grep, awk, tail, etc.
Las expresiones regulares representan un metalenguaje extremadamente potente dedicado a la manipulación de cadenas de caracteres. Las utilizamos para comparar cadenas y/o capturar cadenas de caracteres que respondan a un modelo específico dentro de archivos de texto.
Las expresiones regulares surgieron, en los años 1950, de la mente de un matemático reconocido, y a continuación se implementaron en los años 70 en las primeras versiones de Unix. Es probable que sea la razón por la cual su sintaxis puede parece bastante rocambolesca a primera vista. ¡Pero no se deje impresionar!
Le invitamos a consultar la ayuda en línea y en particular la sección de ayuda about_Regular_Expression que constituye una introducción a la materia interesante.
PowerShell dispone de los dos operadores de comparación de expresiones regulares siguientes:
Operador |
Significado |
-match |
Comparación de igualdad entre un pattern (patrón) y una expresión regular. |
-notmatch |
Comparación de desigualdad entre un pattern (patrón) y una expresión regular. |
El principio de las expresiones regulares es hacer corresponder un modelo (llamado «pattern» en inglés) con una cadena de caracteres. Permiten analizar grandes cantidades de datos, de manera muy eficiente y con un mínimo de esfuerzo (cuando las dominamos).
El principal inconveniente es que el modelo puede volverse rápidamente muy complejo, y será aún más complicado de descifrar y mantener varios meses después de escribirlos; ¡sobre todo cuando no se practican todos los días!
Las regex se utilizan muchas veces para validar datos introducidos, como por ejemplo una dirección IP o una dirección de correo electrónico. En efecto en estos dos casos es fácil establecer un modelo. Si tomamos el caso de una dirección IPv4, sabemos que está compuesta de cuatro grupos de cifras separados por el carácter...
Operador de rango
El operador de rango se indica con .. (pronunciado «punto punto»). Permite, como su nombre indica, cubrir un rango de valores. Si queremos cubrir el rango de valores de 1 a 10 (para realizar un bucle por ejemplo), entonces basta con teclear la siguiente línea:
PS > 1..10
1
2
3
..
10
Podemos, de la misma manera, definir un rango dinámico utilizando variables. Nada le impide definir un rango que vaya de $var1 hasta $var2 si estos valores son enteros.
Ejemplo
PS > $var1 = 5
PS > $var2 = 10
PS > $var1 .. $var2
5
6
7
8
9
10
Operadores de pertenencia
En PowerShell hablamos muchas veces de colecciones de objetos o de array de objetos. El operador de pertenencia, introducido desde PowerShell 3.0, permite saber si un objeto se encuentra o no dentro de una colección.
Operador |
Significado |
-in |
Comprueba si un valor está dentro de una colección. |
-notIn |
Comprueba si un valor no está dentro de una colección. |
Para comprender mejor el uso de estos operadores, le presentamos algunos ejemplos de aplicación:
PS > 'shell' -in 'Console', 'shell'
True
PS > 'shell' -in 'Console', 'powershell'
False
PS > 85 -in 1..99
True
El operador primo hermano de -in es el operador -contains. En efecto, funciona como -in pero de manera inversa. Puede elegir el que corresponda mejor a la lógica de su script.
Operador |
Significado |
-contains |
Comprueba si una colección contiene un valor en particular. |
-notContains |
Comprueba si una colección no contiene un determinado valor. |
Para entender mejor el uso de estos operadores, a continuación verá algunos ejemplos de aplicación:
PS > 'Console', 'shell' -contains 'shell'
True
PS > 'Console', 'powershell' -contains 'shell'
False
PS > 1..99 -contains 85
True
Operador de sustitución
El operador de sustitución -replace es un operador muy potente. Probablemente hubiese merecido ser llamado -searchAndReplace por su eficacia, pero probablemente se consideraría su nombre demasiado largo.
En su forma más simple -replace puede aplicarse sobre una cadena simple (escalar), como en el ejemplo siguiente:
PS > 'PowerShell' -replace 'Shell', 'Jose'
PowerJose
Shell representa la cadena a buscar y Jose la cadena de sustitución.
Aunque esto funcione perfectamente, este caso de uso no ofrece mucha más funcionalidad que el método Replace() aplicado a una cadena como sigue:
PS > $MiCadena = 'PowerShell'
PS > $MiCadena.Replace('Shell','Jose')
PowerJose
El mayor interés de este operador es que se puede aplicar a un array para buscar y reemplazar un valor por otro. Mejor aún, -replace acepta como entrada una expresión regular, lo que permite búsquedas complejas y aún hay mucho más…
1. Sustitución con la ayuda de una expresión regular
Aunque usemos una cadena de caracteres simple para efectuar la búsqueda, el operador -replace la considera como una expresión regular.
En el ejemplo que sigue, creamos una expresión regular que corresponde a una fecha cualquiera con el formato DD/MM/AAAA que reemplazaremos con la cadena Sábado:
PS >...
Operadores de tipo
Hasta ahora hemos hablado de cómo tipar su valor y también de cómo recuperar el tipo con el método GetType. A continuación, vamos a descubrir cómo comprobar el tipo de una variable.
Estos operadores se utilizan relativamente poco en la medida en que, cuando definimos parámetros (en los scripts o las funciones), les asignamos un tipo. De modo que no es realmente útil comprobar su tipo... Dicho esto, como estos operadores existen, nos parece útil hablar de ellos.
Operador |
Significado |
-is |
Comprueba si el objeto es del mismo tipo. |
-isNot |
Comprueba si el objeto no es del mismo tipo. |
Para ilustrar mejor el uso de estos operadores, presentamos algunos ejemplos de uso:
PS > 'Hola' -is [string]
True
PS > 20 -is [int]
True
PS > 'B' -is [int]
False
Operadores lógicos
Los operadores lógicos permiten verificar varias comparaciones en una misma expresión. Por ejemplo: ($var1 -eq $var2) -and ($var3 -eq $var4) devolverá el booleano true si $var1 es igual a $var2 y $var3 es igual a $var4, en caso contrario el valor devuelto será false. Aquí tiene la lista de los operadores lógicos disponibles:
Operador |
Significado |
-and |
Y lógico |
-or |
O lógico |
-not |
NO lógico |
! |
NO lógico |
-xor |
O exclusivo |
Para entender mejor el uso de estos operadores, veamos algunos ejemplos de aplicación:
PS > (5 -eq 5) -and (8 -eq 9)
False
Falso ya que 5 es igual a 5, pero 8 no es igual a 9.
PS > (5 -eq 5) -or (8 -eq 9)
True
Verdadero ya que una de las dos expresiones es verdadera, 5 es por supuesto igual a 5.
PS > -not (8 -eq 9)
True
PS > !(8 -eq 9)
True
Verdadero ya que 8 no es igual a 9.
Operadores binarios
Los operadores binarios se utilizan para realizar operaciones entre números binarios. Como recordatorio, el sistema binario es un sistema en base 2, a diferencia del sistema decimal que está en base 10. Es decir que la notación se compone únicamente de 0 y 1.
Ejemplo de conversión de números decimales en base binaria
Decimal Binario
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
Cuando llamamos a uno de los operadores binarios siguientes, los bits de los valores se comparan uno detrás de otro, y si utilizamos un Y o un O obtenemos un resultado diferente.
Operador |
Significado |
-band |
Operador Y |
-bor |
Operador O |
-bnot |
Operador NO |
-bxor |
Operador O exclusivo |
-shr |
Rellenado de bits por la derecha |
-shl |
Rellenado de bits por la izquierda |
El resultado devuelto después de una comparación binaria se convierte automáticamente en sistema decimal y no en sistema binario.
Imaginemos que para una aplicación cualquiera deseamos saber si el bit con menor peso de una variable es igual a 1. Tomemos como ejemplo el valor decimal 13, o sea 1101 en binario. Vemos claramente que el bit con menor peso es igual a 1, pero para verificar esta afirmación con PowerShell utilizamos mejor nuestro operador...
Operadores de asignación
Ahora sabe cómo asignar un valor a una variable y realizar una operación sobre esta última. A continuación le mostraremos cómo hacer para realizar las dos operaciones al mismo tiempo en una operación.
Las operaciones descritas en la tabla siguiente devuelven estrictamente el mismo resultado.
Notación clásica |
Notación acortada |
$i=$i+8 |
$i+=8 |
$i=$i-8 |
$i-=8 |
$i=$i*8 |
$i*=8 |
$i=$i/8 |
$i/=8 |
$i=$i%8 |
$i%=8 |
$i=$i+1 |
$i++ |
$i=$i-1 |
$i-- |
La notación $i++ o $i-- es muy utilizada en las condiciones de los bucles de manera que se incrementa o decrementa $i de 1 en cada paso.
Así, por ejemplo, vemos cómo añadir un valor con el operador de asignación +=.
PS > $i = 0
PS > $i += 15
PS > $i
15
Si mostramos el valor de la variable $i, obtenemos 15 ya que esta instrucción es equivalente a: $i = $i + 15.
Sigamos esta vez con el cálculo de factoriales de los números que van de 1 a 10.
Para ello, creamos un bucle y, para cada valor de $i, multiplicaremos por el valor de $var antes de realizar la asignación:
PS > $var = 1
PS > foreach($i in 1..10){$var *= $i ; $var}
1
2
6
24
120
720
5040
40320
362880
3628800
Como todavía no hemos abordado la noción de bucle foreach, no preste...
Operadores de redirección
Debe saber que los intérpretes de comandos tratan la información según una entrada, una salida y un error estándar, estando cada elemento identificado por un descriptor de archivo.
Descriptor |
Identificación |
Explicación |
0 |
Standard Input |
Flujo de entrada por el cual las datos se introducen en la shell. Por defecto, la entrada estándar es el teclado. |
1 |
Standard Output |
Flujo de salida por defecto por el cual se emiten los datos. El flujo estándar es usado por la mayor parte de los comandos que muestran un resultado en pantalla. |
2 |
Error |
Flujo de salida que permite al shell emitir los mensajes de error. Su visibilidad se gestiona mediante la variable $ErrorActionPreference. |
3 |
Warning |
Flujo de salida que permite al shell emitir los mensajes de warning. Son visibles si la variable $WarningPreference vale Continue. |
4 |
Verbose |
Flujo de salida de mensajes detallados. Estos mensajes son visibles cuando el mode verbose se habilita mediante la variable $VerbosePreference. |
5 |
Debug |
Flujo de salida de mensajes de depuración. Estos mensajes son visibles cuando el mode debug se habilita mediante la variable $DebugPreference. |
6 |
Information |
Flujo de salida de los mensajes de información. Estos serán visibles si la variable $InformationPreference vale Continue. |
* |
Todos los flujos |
El carácter asterisco representa todos los flujos. |
Los flujos *, 3, 4 y 5 y sus variables de preferencia asociadas se han introducido con la versión 3 de PowerShell.
El flujo 6 (information) se ha introducido con la versión 5.
Por defecto, la salida estándar es la consola para todos los flujos enumerados anteriormente. Pero para redirigirlos con flexibilidad, PowerShell dispone de una batería de operadores.
Estos últimos son idénticos a los utilizados en la shell de Unix:
Operador |
Significado |
x> y |
Redirige el flujo x hacia el archivo y. Si el archivo y ya existe, el contenido del archivo se reemplaza. Ejemplo 2> error.log redirige el error estándar hacia el archivo error.log. |
x>> y |
Redirige el flujo x hacia el archivo y en modo añadir. Si el archivo y ya existe, el flujo se añade entonces... |
Operadores de partición y de concatenación
Los operadores de partición y de concatenación permiten combinar o fraccionar cadenas de caracteres a voluntad.
Operador |
Significado |
-split |
Fracciona una cadena en subcadenas. |
-join |
Concatena varias cadenas en una. |
Así, por ejemplo, podemos partir una cadena utilizando el operador -split al inicio de la línea.
PS > -split 'PowerShell es sencillo'
PowerShell
es
sencillo
Por defecto, la división se realiza con el delimitador espacio « ». Para cambiar el delimitador, conviene situar el operador al final de la línea y a continuación indicar el carácter deseado.
Ejemplo
PS > 'Apellido:Nombre:Dirección:Fecha' -split ':'
Apellido
Nombre
Dirección
Fecha
El delimitador puede ser: un carácter único, una cadena de caracteres, una expresión regular o un bloque de script (scriptblock).
Para obtener más detalle, le invitamos a consultar la sección de ayuda about_Split, que es muy completa.
El operador -join permite concatenar varias cadenas de caracteres de un mismo array.
Ejemplo
PS > $array = 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes',
'Sábado', 'Domingo'
PS > -join $array
LunesMartesMiércolesJuevesViernesSábadoDomingo ...
Operador de formato -f
1. Nociones básicas
El operador de formato -f permite formatear cadenas de caracteres a la manera .NET, es decir exactamente de la misma manera que podríamos hacerlo en VB.NET o C#.
El principio básico es muy simple; en efecto, se trata de reservar uno o varios emplazamientos predefinidos en una cadena de caracteres y substituir estos últimos por un valor (o expresión). Basta entonces con definir uno o varios nombres entre llaves (comenzando por cero) en una cadena, y automáticamente estos últimos serán substituidos por un valor en tiempo de ejecución.
Ejemplo 1:
PS > $str = 'powershell'
PS > '{0} es un potente lenguaje de scripts.' -f $str.ToUpper()
POWERSHELL es un potente lenguaje de scripts.
Evidentemente existen otras maneras de concatenar cadenas de caracteres, sin embargo nos gusta particularmente el operador -f ya que aporta cierta facilidad de escritura y una gran facilidad para la comprensión del código. Esto es sobre todo cierto cuando tenemos que concatenar varios datos para mostrarlos formateados en un archivo de texto.
Ejemplo 2:
PS > $str1 = 'powershell'
PS > $str2 = '¡{0}, un concentrado de potencia en solo {1} caracteres !' -f
PS > $str2 -f $str1.ToUpper(), $str1.length
¡POWERSHELL, un concentrado de potencia en solo 10 caracteres...
Resumen de operadores
En esta lista encontrará todos los operadores enunciados en este capítulo:
Operador |
Significado |
-eq |
Igual. |
-lt |
Inferior a. |
-gt |
Superior a. |
-le |
Inferior o igual a. |
-ge |
Superior o igual a. |
-ne |
Diferente de. |
-not |
NO lógico. |
! |
NO lógico. |
-match |
Comparación de igualdad entre una expresión y una expresión regular. |
-notMatch |
Comparación de desigualdad entre una expresión y una expresión regular. |
-like |
Comparación de igualdad para expresiones genéricas. |
-notLike |
Comparación de desigualdad para expresiones genéricas. |
-replace |
Operador de sustitución. |
-and |
Y lógico. |
-or |
O lógico. |
-bor |
Operador de bits O. |
-band |
Operador de bits Y. |
-bxor |
Operador de bits O exclusivo. |
-shr |
Desplazamiento de bits hacia la derecha. |
-shl |
Desplazamiento de bits hacia la izquierda. |
-xor |
O exclusivo. |
-is |
Operador de igualdad de tipo. |
-isNot |
Operador de desigualdad de tipo. |
-in |
Comprueba si un valor está en una colección. |
-notIn |
Comprueba si un valor no está en una colección. |
-contains |
Comprueba si una colección contiene un valor. |
-notContains |
Comprueba si una colección no contiene un valor. |
-ceq |
Igual (respeta el case sensitive). |
-clt |
Inferior a (respeta el case sensitive). |
-cgt |
Superior a (respeta el case sensitive). |
-cle |
Inferior o igual a (respeta el case sensitive). |
-cge |
Superior o igual a (respeta el case sensitive). |
-cne |
Diferente de (respeta el case sensitive). |
-cmatch |
Comparación de igualdad entre una expresión y una expresión regular (respeta el case sensitive). |
-cnotmatch |
Comparación de desigualdad entre... |