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

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.

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.

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.

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.

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 background &

Ejecuta la canalización antes que en segundo plano, en un trabajo de PowerShell. Este operador actúa de forma similar a la y comercial del operador de control UNIX (&), que ejecuta el comando antes de que se encuentre de forma asincrónica en subshell como trabajo.

Este operador es funcionalmente equivalente a Start-Job. De forma predeterminada, el operador en segundo plano inicia los trabajos en el directorio de trabajo actual del autor de la llamada que inició las tareas paralelas. En el ejemplo siguiente se muestra el uso básico del operador de trabajo en segundo plano.

Get-Process -Name pwsh &

Ese comando es funcionalmente equivalente al uso siguiente de Start-Job:

Start-Job -ScriptBlock {Get-Process -Name pwsh}

Al igual que Start-Job, el & operador de fondo devuelve un Job objeto . Este objeto se puede usar con Receive-Job y Remove-Job, como si hubiera usado Start-Job para iniciar el trabajo.

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

El & operador en segundo plano también es un terminador de instrucción, al igual que el operador de control UNIX y (&). Esto le permite invocar comandos adicionales después del & operador en segundo plano. En el ejemplo siguiente se muestra la invocación de comandos adicionales después del & operador en segundo plano.

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Esto equivale al siguiente script:

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

Si desea ejecutar varios comandos, cada uno en su propio proceso en segundo plano, pero todo en una sola línea, simplemente coloque & entre y después de cada uno de los comandos.

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

Para obtener más información sobre los trabajos de PowerShell, consulte about_Jobs.

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'}

Operadores && de cadena de canalización y ||

Ejecute condicionalmente la canalización del lado derecho en función del éxito de la canalización del lado izquierdo.

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

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

Operador de intervalo ..

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

Nota:

Se ha agregado compatibilidad con intervalos de caracteres en PowerShell 6.

Intervalos de números

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 [int]::MaxValue - 56. Este es el tamaño máximo de una matriz en .NET.

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.

Intervalos de caracteres

Para crear un intervalo de caracteres, incluya los caracteres entre comillas.

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

Si asigna un intervalo de caracteres a una cadena, se trata de la misma asignación de una matriz de caracteres a una cadena.

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

Los caracteres de la matriz se unen a una cadena. Los caracteres están separados por el valor de la $OFS variable de preferencia. Para obtener más información, consulte about_Preference_Variables.

El orden de los caracteres de la matriz viene determinado por el valor ASCII del carácter. Por ejemplo, los valores ASCII de c y X son 99 y 88, respectivamente. Ese intervalo se presentaría en orden inverso.

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

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]:: $_ }

Operador ternario ? <if-true> : <if-false>

Puede usar el operador ternario como reemplazo de la if-else instrucción en casos condicionales simples.

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

Operador de fusión de NULL ??

El operador de fusión de NULL ?? devuelve el valor de su operando de la izquierda si no es NULL. De lo contrario, evalúa el operando de la derecha y devuelve su resultado. El operador ?? no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL.

$x = $null
$x ?? 100
100

En el ejemplo siguiente, el operando de la derecha no se evaluará.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Operador de asignación de coalescencia NULL ??=

El operador de asignación de coalescencia NULL ??= asigna el valor del operando de la derecha a su operando de la izquierda solo si este último se evalúa como NULL. El operador ??= no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL.

$x = $null
$x ??= 100
$x
100

En el ejemplo siguiente, el operando de la derecha no se evaluará.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020

Operadores condicionales NULL ?. y ?[]

Nota:

Esta característica se movió de la rama experimental a la estándar en PowerShell 7.1.

Un operador condicional NULL aplica un acceso a miembros, ?., o el acceso a elementos, ?[], operación a su operando solo si ese operando se evalúa como no NULL; de lo contrario, devuelve NULL.

Puesto que PowerShell permite que ? forme parte del nombre de la variable, se requiere la especificación formal del nombre de la variable para utilizar estos operadores. Debe usar llaves ({}) alrededor de los nombres de variable como ${a} o cuando ? forma parte del nombre ${a?}de la variable .

Nota:

La sintaxis de nombre de variable de ${<name>} no debe confundirse con el $() operador de subexpresión. Para obtener más información, consulte la sección Nombre de variable de about_Variables.

En el siguiente ejemplo, se devuelve el valor de PropName.

$a = @{ PropName = 100 }
${a}?.PropName
100

En el ejemplo siguiente se devuelve null sin intentar acceder al nombre de miembro PropName.

$a = $null
${a}?.PropName

En este ejemplo, se devuelve el valor del elemento indizado.

$a = 1..10
${a}?[0]
1

En el ejemplo siguiente se devuelve null sin intentar acceder al elemento indizado.

$a = $null
${a}?[0]

Consulte también