about_Operators

Descripción breve

Describe los operadores admitidos por PowerShell.

Descripción larga

Un operador es un elemento de lenguaje que se puede usar en un comando o expresión. PowerShell admite varios tipos de operadores para ayudarle a manipular valores.

Operadores aritméticos

Use operadores aritméticos (+, -, *, /, %) para calcular valores en un comando o expresión. Con estos operadores, puede agregar, restar, multiplicar o dividir valores y calcular el resto (módulo) de una operación de división.

El operador de suma concatena los elementos. El operador de multiplicación devuelve el número especificado de copias de cada elemento. Puede usar operadores aritméticos en cualquier tipo de .NET que los implemente, como: Int, String, , HashtableDateTimey Matrices.

Los operadores bit a bit (-band, -bor, -bxor, -bnot, -shl, -shr) manipulan los patrones de bits en valores.

Para obtener más información, consulte about_Arithmetic_Operators.

Operadores de asignación

Use operadores de asignación (=, +=, -=, *=, , /=%=) para asignar, cambiar o anexar valores a variables. Puede combinar operadores aritméticos con asignación para asignar el resultado de la operación aritmética a una variable.

Para obtener más información, consulte about_Assignment_Operators.

Operadores de comparación

Use operadores de comparación (-eq, -ne, -gt, -lt, -le, ) -gepara comparar valores y condiciones de prueba. Por ejemplo, puede comparar dos valores de cadena para determinar si son iguales.

Los operadores de comparación también incluyen operadores que buscan o reemplazan patrones en texto. Los operadores (-match, -notmatch, -replace) usan expresiones regulares y (-like, -notlike) usan caracteres *comodín .

Los operadores de comparación de contención determinan si un valor de prueba aparece en un conjunto de referencia (-in, -notin, -contains, -notcontains).

Los operadores de comparación de tipos (-is, -isnot) determinan si un objeto es de un tipo determinado.

Para obtener más información, consulte about_Comparison_Operators.

Operadores lógicos

Use operadores lógicos (-and, -or, -xor, -not, !) para conectar instrucciones condicionales a un único condicional complejo. Por ejemplo, puede usar un operador lógico -and para crear un filtro de objetos con dos condiciones diferentes.

Para obtener más información, consulte about_Logical_Operators.

Operadores de redireccionamiento

Use operadores de redireccionamiento (>, >>, 2>, 2>>y 2>&1) para enviar la salida de un comando o expresión a un archivo de texto. Los operadores de redireccionamiento funcionan como el Out-File cmdlet (sin parámetros), pero también le permiten redirigir la salida del error a los archivos especificados. También puede usar el cmdlet para redirigir la Tee-Object salida.

Para obtener más información, consulte about_Redirection

Operadores de división y combinación

Los -split operadores y -join dividen y combinan subcadenas. El -split operador divide una cadena en subcadenas. El -join operador concatena varias cadenas en una sola cadena.

Para obtener más información, consulte about_Split y about_Join.

Operadores de tipo

Use los operadores de tipo (-is, -isnot, -as) para buscar o cambiar el tipo de .NET de un objeto.

Para obtener más información, consulte about_Type_Operators.

Operadores unarios

Use los operadores unarios ++ y -- para incrementar o disminuir los valores y - para la negación. Por ejemplo, para incrementar la variable $a de 9 a 10, escriba $a++.

Para obtener más información, consulte about_Arithmetic_Operators.

Operadores especiales

Los operadores especiales tienen casos de uso específicos que no caben en ningún otro grupo de operadores. Por ejemplo, los operadores especiales permiten ejecutar comandos, cambiar el tipo de datos de un valor o recuperar elementos de una matriz.

Operador de agrupación ( )

Al igual que en otros lenguajes, (...) sirve para invalidar la precedencia del operador en las expresiones. Por ejemplo: (1 + 2) / 3

Sin embargo, en PowerShell hay comportamientos adicionales.

Expresiones de resultado de agrupación

(...) permite permitir que la salida de un comando participe en una expresión. Por ejemplo:

PS> (Get-Item *.txt).Count -gt 10
True

Nota:

El ajuste de un comando entre paréntesis hace que la variable $? automática se establezca $trueen , incluso cuando el propio comando incluido se establece $false$? en . Por ejemplo, (Get-Item /Nosuch); $? produce inesperadamente True. Para obtener más información sobre $?, vea about_Automatic_Variables.

Canalización de expresiones agrupadas

Cuando se usa como primer segmento de una canalización, ajustar un comando o expresión entre paréntesis invariablemente provoca la enumeración del resultado de la expresión. Si los paréntesis encapsulan un comando, se ejecuta para finalizar con toda la salida recopilada en la memoria antes de que los resultados se envíen a través de la canalización.

Por ejemplo, las salidas de estas instrucciones son diferentes:

PS> ConvertFrom-Json '["a", "b"]'   | ForEach-Object { "The value is '$_'" }

The value is 'a b'

PS> (ConvertFrom-Json '["a", "b"]') | ForEach-Object { "The value is '$_'" }

The value is 'a'
The value is 'b'

La agrupación de una expresión antes de canalización también garantiza que el procesamiento posterior de objetos por objeto no pueda interferir con la enumeración que usa el comando para generar su salida.

Por ejemplo, la canalización de la salida de Get-ChildItem a Rename-Item puede tener efectos inesperados en los que se cambia el nombre de un elemento y, a continuación, se vuelve a detectar y se cambia el nombre una segunda vez.

Instrucciones de asignación de agrupación

Las instrucciones de asignación sin agrupar no generan valores. Al agrupar una instrucción de asignación, el valor de la variable asignada se pasa a través y se puede usar en expresiones más grandes. Por ejemplo:

PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True

Ajustar la instrucción entre paréntesis la convierte en una expresión que genera el valor de $var.

Este comportamiento se aplica a todos los operadores de asignación, incluidos los operadores compuestos, como +=, y los operadores de incremento (++) y decremento (--). Sin embargo, el orden de funcionamiento para el incremento y el decremento depende de su posición.

PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1

En el caso de prefijo, el valor de se incrementa antes de $i la salida. En el caso de postfijo, el valor de se incrementa después de $i la salida.

También puede usar esta técnica En el contexto de una instrucción condicional, como la if instrucción .

if ($textFiles = Get-ChildItem *.txt) {
    $textFiles.Count
}

En este ejemplo, si no coinciden archivos, el Get-ChildItem comando no devuelve nada y asigna nada a $textFiles, que se considera $false en un contexto booleano. Si se asignan uno o varios objetos FileInfo a $textFiles, el condicional se evalúa como $true. Puede trabajar con el valor de $textFiles en el cuerpo de la if instrucción .

Nota:

Aunque esta técnica es cómoda y concisa, puede provocar confusión entre el operador de asignación (=) y el operador de comparación de igualdad (-eq).

Operador Subexpression $( )

Devuelve el resultado de una o varias instrucciones. Para un único resultado, devuelve un escalar. Para varios resultados, devuelve una matriz. Úselo cuando quiera usar una expresión dentro de otra expresión. Por ejemplo, para insertar los resultados del comando en una expresión de cadena.

PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20

PS> "Folder list: $((dir c:\ -dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows

Operador subexpression de matriz @( )

Devuelve el resultado de una o varias instrucciones como una matriz. El resultado siempre es una matriz de 0 o más objetos.

PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -eq Starting )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
0

Sintaxis literal de tabla hash @{}

De forma similar a la subexpresión de matriz, esta sintaxis se usa para declarar una tabla hash. Para obtener más información, consulte about_Hash_Tables.

Operador call &

Ejecuta un comando, un script o un bloque de scripts. El operador de llamada, también conocido como "operador de invocación", permite ejecutar comandos almacenados en variables y representados por cadenas o bloques de script. El operador de llamada se ejecuta en un ámbito secundario. Para obtener más información sobre los ámbitos, consulte about_Scopes.

En este ejemplo se almacena un comando en una cadena y se ejecuta mediante el operador de llamada.

PS> $c = "get-executionpolicy"
PS> $c
get-executionpolicy
PS> & $c
AllSigned

El operador de llamada no analiza las cadenas. Esto significa que no se pueden usar parámetros de comando dentro de una cadena cuando se usa el operador de llamada.

PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.
At line:1 char:2
+ & $c
+  ~~
    + CategoryInfo          : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

El cmdlet Invoke-Expression puede ejecutar código que provoca errores de análisis al usar el operador de llamada.

PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At line:1 char:2
+ & "1+1"
+  ~~~~~
    + CategoryInfo          : ObjectNotFound: (1+1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
PS> Invoke-Expression "1+1"
2

Puede ejecutar un script con su nombre de archivo. Un archivo de script debe tener una .ps1 extensión de archivo para que sea ejecutable. Los archivos que tienen espacios en su ruta de acceso deben incluirse entre comillas. Si intenta ejecutar la ruta de acceso entre comillas, PowerShell muestra el contenido de la cadena entrecomillada en lugar de ejecutar el script. El operador de llamada permite ejecutar el contenido de la cadena que contiene el nombre de archivo.

PS C:\Scripts> Get-ChildItem

    Directory: C:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/28/2018   1:36 PM             58 script name with spaces.ps1

PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!

Para obtener más información sobre los bloques de scripts, consulte about_Script_Blocks.

Operador Cast [ ]

Convierte o limita los objetos al tipo especificado. Si los objetos no se pueden convertir, PowerShell genera un error.

[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'

También se puede realizar una conversión cuando se asigna una variable al uso de la notación de conversión.

Operador coma ,

Como operador binario, la coma crea una matriz o anexa a la matriz que se va a crear. En el modo de expresión, como operador unario, la coma crea una matriz con un solo miembro. Coloque la coma delante del miembro.

$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)

Puesto Write-Output que espera un argumento, debe colocar la expresión entre paréntesis.

Operador dot sourcing .

Ejecuta un script en el ámbito actual para que las funciones, alias y variables que cree el script se agreguen al ámbito actual, reemplazando las existentes. Los parámetros declarados por el script se convierten en variables. Los parámetros para los que no se ha proporcionado ningún valor se convierten en variables sin ningún valor. Sin embargo, se conserva la variable $args automática.

. c:\scripts\sample.ps1 1 2 -Also:3

Nota:

El operador dot sourcing va seguido de un espacio. Use el espacio para distinguir el punto del símbolo de punto (.) que representa el directorio actual.

En el ejemplo siguiente, el script Sample.ps1 del directorio actual se ejecuta en el ámbito actual.

. .\sample.ps1

Operador Format -f

Da formato a las cadenas mediante el método de formato de los objetos de cadena. Escriba la cadena de formato en el lado izquierdo del operador y los objetos a los que se va a dar formato en el lado derecho del operador.

"{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello      3.14

Puede rellenar cero un valor numérico con el especificador personalizado "0". El número de ceros que sigue a : indica el ancho máximo al que rellenar la cadena con formato.

"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365

Si necesita mantener las llaves ({}) en la cadena con formato, puede escaparlas duplicando las llaves.

"{0} vs. {{0}}" -f 'foo'
foo vs. {0}

Para obtener más información, vea el método String.Format y el formato compuesto.

Operador index [ ]

Selecciona objetos de colecciones indexadas, como matrices y tablas hash. Los índices de matriz son de base cero, por lo que el primer objeto se indexa como [0]. También puede usar índices negativos para obtener los últimos valores. Las tablas hash se indexan por valor de clave.

Dada una lista de índices, el operador de índice devuelve una lista de miembros correspondientes a esos índices.

PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object installedOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...

Cuando un objeto no es una colección indizada, el uso del operador index para tener acceso al primer elemento devuelve el propio objeto. Los valores de índice más allá del primer elemento devuelven $null.

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

Operador de canalización |

Envía ("canalizaciones") la salida del comando que lo precede al comando que lo sigue. Cuando la salida incluye más de un objeto (una "colección"), el operador de canalización envía los objetos uno a uno.

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

Operador de intervalo ..

El operador range se puede usar para representar una matriz de enteros secuenciales. Los valores unidos por el operador de intervalo definen los valores inicial y final del intervalo.

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

También puede crear intervalos en orden inverso.

10..1
5..-5 | ForEach-Object {Write-Output $_}

Los valores inicial y final del intervalo pueden ser cualquier par de expresiones que se evalúen como un entero o un carácter. Los puntos de conexión del intervalo deben convertirse en enteros de 32 bits con signo ([int32]). Los valores más grandes provocan un error. Además, si el intervalo se captura en una matriz, el tamaño de la matriz resultante se limita a 268435448 (o 256mb - 8). Este es el tamaño máximo de una matriz en .NET Framework.

Por ejemplo, podría usar los miembros de una enumeración para los valores de inicio y finalización.

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Importante

El intervalo resultante no se limita a los valores de la enumeración. En su lugar, representa el intervalo de valores entre los dos valores proporcionados. No se puede usar el operador range para representar de forma confiable los miembros de una enumeración.

Operador de acceso a miembros .

Obtiene acceso a las propiedades y métodos de un objeto . El nombre del miembro puede ser una expresión.

$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }

A partir de PowerShell 3.0, cuando se usa el operador en un objeto de colección de listas que no tiene el miembro, PowerShell enumera automáticamente los elementos de esa colección y usa el operador en cada uno de ellos. Para obtener más información, consulte about_Member-Access_Enumeration.

Operador de miembro estático ::

Llama a las propiedades y métodos estáticos de una clase .NET. Para buscar las propiedades y métodos estáticos de un objeto, use el parámetro Static del Get-Member cmdlet . El nombre del miembro puede ser una expresión.

[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }

Consulte también