TEMA
about_arithmetic_operators
DESCRIPCIÓN BREVE
Describe los operadores que realizan operaciones aritméticas en
Windows PowerShell.
DESCRIPCIÓN DETALLADA
Los operadores aritméticos calculan valores numéricos. Puede
utilizar uno o más operadores aritméticos para sumar, restar,
multiplicar y dividir valores, así como para calcular el resto
(módulo) de una operación de división.
Además, el operador de adición (+) y el operador de
multiplicación (*) también funcionan con cadenas, matrices y
tablas hash. El operador de adición concatena la entrada. El
operador de multiplicación devuelve varias copias de la entrada.
Incluso se pueden mezclar tipos de objetos en una instrucción
aritmética.
El tipo del objeto del extremo izquierdo de la expresión
determina el método que se utiliza para evaluar la instrucción.
Windows PowerShell admite los siguientes operadores aritméticos:
Operador Descripción Ejemplo
-------- ----------- -------
+ Suma números enteros; concatena 6+2
cadenas, matrices y tablas hash. "archivo" + "nombre"
- Resta un valor de otro. 6-2
(get-date).date - 1
- Convierte un número en negativo. -6+2
-4
* Multiplica números enteros; copia 6*2
las cadenas y las matrices el número "w" * 3
de veces especificado.
/ Divide dos valores. 6/2
% Devuelve el resto de una operación 7%2
de división.
PRIORIDAD DE OPERADORES
Windows PowerShell procesa los operadores aritméticos en el orden
siguiente:
Paréntesis ()
- (para un número negativo)
*, /, %
+, - (para la resta)
Windows PowerShell procesa las expresiones de izquierda a
derecha, según las reglas de precedencia. En los ejemplos
siguientes se muestra el efecto de las reglas de precedencia:
C:\PS> 3+6/3*4
11
C:\PS> 10+4/2
12
C:\PS> (10+4)/2
7
C:\PS> (3+3)/ (1+1)
3
El orden en el que Windows PowerShell evalúa las expresiones
podría variar con respecto al de otros lenguajes de programación
y creación de script utilizados. En el ejemplo siguiente se
muestra una instrucción de asignación complicada.
C:\PS> $a = 0
C:\PS> $b = 1,2
C:\PS> $c = -1,-2
C:\PS> $b[$a] = $c[$a++]
C:\PS> $b
1
-1
En este ejemplo, la expresión $a++ se evalúa antes que $c[$a++].
Al evaluar $a++, cambia el valor de $a. La variable $a de $b[$a]
es igual a 1, no a 0, de modo que la instrucción asigna un valor
a $b[1], no a $b[0].
SUMAR Y MULTIPLICAR TIPOS NO NUMÉRICOS
Es posible sumar números, cadenas, matrices y tablas hash.
Además, se pueden multiplicar números, cadenas y matrices. Sin
embargo, no se pueden multiplicar las tablas hash.
Al sumar cadenas, matrices o tablas hash, se concatenan los
elementos. Al concatenar colecciones, como matrices o tablas
hash, se crea un nuevo objeto que contiene los objetos de ambas
colecciones. Si se intentan concatenar tablas hash que tienen la
misma clave, se produce un error en la operación.
Por ejemplo, los comandos siguientes crean dos matrices y, a
continuación, las suman:
C:\PS> $a = 1,2,3
C:\PS> $b = "A","B,"C"
C:\PS> $a + $b
1
2
3
A
B
C
También es posible realizar operaciones aritméticas con objetos
de tipos diferentes. El tipo de Microsoft .NET Framework del
objeto del extremo izquierdo de la operación determina la
operación que Windows PowerShell realiza.Windows PowerShell
intenta convertir todos los objetos de la operación al tipo de
.NET Framework del primer objeto. Si consigue convertir los objetos
correctamente, realiza la operación adecuada para el tipo de .NET
Framework del primer objeto. Si no convierte cualquiera de los objetos,
se produce un error en la operación.
En el ejemplo siguiente se demuestra el uso de los operadores de
adición y multiplicación en operaciones que incluyen tipos de objetos
diferentes:
C:\PS> "archivo" + 16
archivo16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "archivo"
1
2
3
archivo
C:\PS> "archivo" * 3
archivoarchivoarchivo
Dado que el objeto del extremo izquierdo determina qué método se
usa para evaluar las instrucciones, en Windows PowerShell las
operaciones de suma y multiplicación no son estrictamente
conmutativas. Por ejemplo, (a + b) no siempre es igual a (b + a),
y (a * b) no siempre es igual a (b * a).
En el siguiente ejemplo se muestra este principio:
C:\PS> "archivo" + 2
archivo2
C:\PS> 2 + "archivo"
No se puede convertir el valor "archivo" a tipo
"System.Int32". Error: "La cadena de entrada no tiene el
formato correcto."
En línea:1 carácter:4
+ 2 + <<<< "archivo"
C:\PS> "archivo" * 3
archivoarchivoarchivo
C:\PS> 3 * "archivo"
No se puede convertir el valor "archivo" a tipo
"System.Int32". Error: "La cadena de entrada no tiene el
formato correcto."
En línea:1 carácter:4
+ 3 * <<<< "archivo"
Las tablas hash son un caso ligeramente diferente. Las tablas
hash se pueden sumar. También es posible sumar una tabla hash a
una matriz. Sin embargo, no se puede sumar ningún otro tipo a una
tabla hash.
En los ejemplos siguientes se muestra cómo sumar tablas hash
entre sí y cómo sumarlas a otros objetos:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}
C:\PS> $hash1 + $hash2
Nombre Valor
---- -----
c2 Server02 1
a 1
b 2
c1 Server01 3
c 3
C:\PS> $hash1 + 2
Solo se puede agregar una tabla de hash a otra tabla de hash.
En línea:1 carácter:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
No se puede convertir "System.Collections.Hashtable" a "System.Int32".
En línea:1 carácter:4
+ 2 + <<<< $hash1
En los ejemplos siguientes se muestra que se puede sumar una
tabla hash a una matriz. La tabla hash completa se suma a la
matriz como un único objeto.
C:\PS> $array = 1,2,3
C:\PS> $array + $hash1
1
2
3
Nombre Valor
---- -----
a 1
b 2
c 3
C:\PS> $sum = $array + $hash1
C:\PS> $sum.count
4
C:\PS> $sum[3]
Nombre Valor
---- -----
a 1
b 2
c 3
PS C:\ps-test> $sum + $hash2
1
2
3
Nombre Valor
---- -----
a 1
b 2
c 3
c2 Server02
En el ejemplo siguiente se muestra que no se pueden sumar tablas
hash que contienen la misma clave:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c="red"}
C:\PS> $hash1 + $hash2
Argumento incorrecto para el operador '+': Ya se ha agregado
el elemento. Clave en el diccionario: 'c' Clave agregada: 'c.'
En línea:1 carácter:9
+ $hash1 + <<<< $hash2
Aunque los operadores de adición son muy útiles, deben utilizarse los
operadores de asignación para agregar elementos a las tablas hash y a
las matrices. Para obtener más información, vea about_assignment_opera
tors. En los ejemplos siguientes se utiliza el operador de asignación
+= para agregar elementos a una matriz:
C:\PS> $array
1
2
3
C:\PS> $array + "archivo"
1
2
3
archivo
C:\PS> $array
1
2
3
C:\PS> $array += "archivo"
C:\PS> $array
1
2
3
archivo
C:\PS> $hash1
Nombre Valor
---- -----
a 1
b 2
c 3
C:\PS> $hash1 += @{e = 5}
C:\PS> $hash1
Nombre Valor
---- -----
a 1
b 2
e 5
c 3
Windows PowerShell selecciona automáticamente el tipo numérico de .NET
Framework que mejor expresa el resultado sin perder precisión. Por ejemplo:
C:\PS> 2 + 3.1
5.1
C:\PS> (2). GetType().FullName
System.Int32
C:\PS> (2 + 3.1).GetType().FullName
System.Double
Si el resultado de una operación es demasiado grande para el
tipo, el tipo del resultado se amplía para alojar el resultado,
como en el ejemplo siguiente:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
El tipo del resultado no será necesariamente igual que el de uno
de los operandos. En el ejemplo siguiente, el valor negativo no
se puede convertir a un entero sin signo y el entero sin signo es
demasiado grande para convertirse a Int32:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
En este ejemplo, Int64 admite ambos tipos.
El tipo System.Decimal es una excepción. Si cualquier operando
tiene el tipo Decimal, el resultado será del tipo Decimal. Si el
resultado es demasiado grande para el tipo Decimal, no se
convertirá a Double, sino que se producirá un error.
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
Valor demasiado grande o demasiado pequeño para Decimal.
En línea:1 carácter:22
+ [Decimal]::maxvalue + <<<< 1
OPERADORES ARITMÉTICOS Y VARIABLES
Los operadores aritméticos también se pueden utilizar con
variables. Los operadores se aplican a los valores de las
variables. En los ejemplos siguientes se muestra cómo se usan los
operadores aritméticos con variables:
C:\PS> $intA = 6
C:\PS> $intB = 4
C:\PS> $intA + $intB
10
C:\PS> $a = "Windows "
C:\PS> $b = "PowerShell "
C:\PS> $c = 2
C:\PS> $a + $b + $c
Windows PowerShell 2
OPERADORES ARITMÉTICOS Y COMANDOS
Normalmente, los operadores aritméticos se utilizan en
expresiones con números, cadenas y matrices. Sin embargo, también
se pueden utilizar con los objetos que los comandos devuelven y
con las propiedades de esos objetos.
En los ejemplos siguientes se muestra cómo utilizar los
operadores aritméticos en expresiones con comandos de Windows
PowerShell:
C:\PS> get-date
Miércoles, 2 de enero de 2008 1:28:42 p.m.
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
Jueves, 3 de enero de 2008 1:28:42 p.m.
C:\PS> get-process | where {($_.ws * 2) -gt 50mb}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1896 39 50968 30620 264 1,572.55 1104 explorer
12802 78 188468 81032 753 3,676.39 5676 OUTLOOK
600 9 36168 26956 143 12.20 988 powershell
561 14 6592 28144 110 1,010.09 496 services
3476 80 34664 26092 234 ...45.69 876 svchost
967 30 58804 59496 416 930.97 2508 WINWORD
EJEMPLOS
En los ejemplos siguientes se muestra cómo utilizar los
operadores aritméticos en Windows PowerShell:
C:\PS> 1 + 1
2
C:\PS> 1 - 1
0
C:\PS> -(6 + 3)
-9
C:\PS> 6 * 2
12
C:\PS> 7 / 2
3,5
C:\PS> 7 % 2
1
C:\PS> w * 3
www
C:\PS> 3 * "w"
No se puede convertir el valor "w" a tipo "System.Int32". Error:
"La cadena de entrada no tiene el formato correcto."
En línea:1 carácter:4
+ 3 * <<<< "w"
PS C:\ps-test> "Windows" + " " + "PowerShell"
Windows PowerShell
PS C:\ps-test> $a = "Windows" + " " + "PowerShell"
PS C:\ps-test> $a
Windows PowerShell
C:\PS> $a[0]
W
C:\PS> $a = "archivosPrueba.txt"
C:\PS> $b = "C:\Logs\"
C:\PS> $b + $a
C:\Logs\archivosPrueba.txt
C:\PS> $a = 1,2,3
C:\PS> $a + 4
1
2
3
4
C:\PS> $servers = @{0 = "LocalHost"; 1 = "Server01"; 2 = "Server02"}
C:\PS> $servers + @{3 = "Server03"}
Nombre Valor
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers
Nombre Valor
---- -----
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers += @{3 = "Server03"} #Usar operador de asignación
C:\PS> $servers
Nombre Valor
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
VEA TAMBIÉN
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
New-TimeSpan