¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PowerShell Core y Windows PowerShell
  3. Operadores
Extrait - PowerShell Core y Windows PowerShell Los fundamentos del lenguaje (2a edición)
Extractos del libro
PowerShell Core y Windows PowerShell Los fundamentos del lenguaje (2a edición) Volver a la página de compra del libro

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...