about_Arithmetic_Operators
Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0
Insertar la introducción aquí.
TEMA
about_Arithmetic_Operators
DESCRIPCIÓN BREVE
Describe los operadores que efectúan operaciones aritméticas en Windows PowerShell®.
DESCRIPCIÓN LARGA
Los operadores aritméticos calculan valores numéricos. Puede usar uno o varios operadores aritméticos para agregar, restar, multiplicar y dividir valores y calcular el resto (módulo) de una operación de división.
Además, el operador de suma (+) y el operador de multiplicación (*) también funcionan en cadenas, matrices y tablas hash. El operador de suma concatena la entrada. El operador de multiplicación devuelve varias copias de la entrada. Incluso puede mezclar tipos de objeto en una instrucción aritmética. El método empleado para evaluar la instrucción está determinado por el tipo del objeto situado más a la izquierda en la expresión.
A partir de Windows PowerShell 2.0, todos los operadores aritméticos funcionan en números de 64 bits.
A partir de Windows PowerShell 3.0, están disponibles los operadores -shr (desplazamiento hacia la derecha) y -shl (desplazamiento hacia la izquierda) para admitir operaciones aritméticas bit a bit en Windows PowerShell.
Windows PowerShell admite los siguientes operadores aritméticos:
Operator Description Example
-------- ----------- -------
+ Adds integers; concatenates strings, 6+2
arrays, and hash tables. "file" + "name"
- Subtracts one value from another 6-2
value. (get-date).date - 1
- Makes a number a negative number. -6+2
-4
* Multiplies integers; copies strings 6*2
and arrays the specified number of "w" * 3
times.
/ Divides two values. 6/2
% Returns the remainder of a division 7%2
operation.
-shl Shift-left 100 -shl 2
-shr Shift-right 100 -shr 1
PRIORIDAD DE LOS OPERADORES
Windows PowerShell procesa los operadores aritméticos en el siguiente orden:
Parentheses ()
- (for a negative number)
*, /, %
+, - (for subtraction)
Windows PowerShell procesa las expresiones de izquierda a derecha según las reglas de prioridad. En los siguientes ejemplos se muestra el efecto de las reglas de prioridad:
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 que Windows PowerShell evalúa las expresiones puede diferir de otros lenguajes de programación y de scripting que utilizara. En el siguiente ejemplo 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++ se cambia el valor de $a. La variable $a en $b[$a] es igual a 1, no a 0, por lo que la instrucción asigna un valor a $b[1], y no a $b[0].
DIVISIÓN Y REDONDEO
Cuando el cociente de una operación de división es un entero, Windows PowerShell redondea el valor al entero más próximo. Cuando el valor es ,5, redondea al entero par más próximo.
En el siguiente ejemplo se muestra el efecto de redondeo al entero par más próximo.
C:\PS> [int]( 5 / 2 )
2
C:\PS> [int]( 7 / 2 )
4
SUMAR Y MULTIPLICAR TIPOS NO NUMÉRICOS
Puede sumar números, cadenas, matrices y tablas hash. También puede multiplicar números, cadenas y matrices. Sin embargo, no puede multiplicar tablas hash.
Al sumar cadenas, matrices o tablas hash, los elementos se concatenan. Al concatenar colecciones, como matrices o tablas hash, se crea un nuevo objeto que contiene los objetos de ambas colecciones. Si intenta concatenar las tablas hash que tienen la misma clave, se produce un error en la operación.
Por ejemplo, los siguientes comandos crean dos matrices y 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 puede efectuar operaciones aritméticas en objetos de distintos tipos. La operación que efectúa Windows PowerShell viene determinada por el tipo de Microsoft .NET Framework del objeto situado más a la izquierda en la operación. Windows PowerShell trata de convertir todos los objetos de la operación en el tipo de .NET Framework del primer objeto. Si la conversión de los objetos es correcta, efectúa la operación de acuerdo con el tipo de .NET Framework del primer objeto. Si la conversión de cualquiera de los objetos falla, se produce un error en la operación.
En el siguiente ejemplo se muestra el uso de los operadores de suma y multiplicación en operaciones que incluyen distintos tipos de objeto:
C:\PS> "file" + 16
file16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "file"
1
2
3
file
C:\PS> "file" * 3
filefilefile
Dado que el método empleado para evaluar las instrucciones está determinado por el objeto situado más a la izquierda, la suma y la multiplicación en Windows PowerShell 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).
Los siguientes ejemplos demuestran este principio:
C:\PS> "file" + 2
file2
C:\PS> 2 + "file"
Cannot convert value "file" to type "System.Int32". Error: "Input
string was not in a correct format."
At line:1 char:4
+ 2 + <<<< "file"
C:\PS> "file" * 3
filefilefile
C:\PS> 3 * "file"
Cannot convert value "file" to type "System.Int32". Error: "Input
string was not in a correct format."
At line:1 char:4
+ 3 * <<<< "file"
Las tablas hash son un caso un poco distinto. Puede sumar tablas hash. También puede sumar una tabla hash a una matriz. Sin embargo, no puede sumar ningún otro tipo a una tabla hash.
En los siguientes ejemplos se muestra cómo sumar tablas hash entre sí y a otros objetos:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}
C:\PS> $hash1 + $hash2
Name Value
---- -----
c2 Server02
a 1
b 2
c1 Server01
c 3
C:\PS> $hash1 + 2
You can add another hash table only to a hash table.
At line:1 char:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
Cannot convert "System.Collections.Hashtable" to "System.Int32".
At line:1 char:4
+ 2 + <<<< $hash1
En los siguientes ejemplos se demuestra que se puede sumar una tabla hash a una matriz. Se suma toda la tabla hash a la matriz como un único objeto.
C:\PS> $array = 1,2,3
C:\PS> $array + $hash1
1
2
3
Name Value
---- -----
a 1
b 2
c 3
C:\PS> $sum = $array + $hash1
C:\PS> $sum.count
4
C:\PS> $sum[3]
Name Value
---- -----
a 1
b 2
c 3
PS C:\ps-test> $sum + $hash2
1
2
3
Name Value
---- -----
a 1
b 2
c 3
c2 Server02
En el siguiente ejemplo 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
Bad argument to operator '+': Item has already been added.
Key in dictionary: 'c' Key being added: 'c'.
At line:1 char:9
+ $hash1 + <<<< $hash2
Aunque los operadores de suma resultan muy útiles, use los operadores de asignación para sumar elementos a las matrices y a las tablas hash. Para más información, consulte about_assignment_operators. En los siguientes ejemplos se usa el operador de asignación += para sumar elementos a una matriz:
C:\PS> $array
1
2
3
C:\PS> $array + "file"
1
2
3
file
C:\PS> $array
1
2
3
C:\PS> $array += "file"
C:\PS> $array
1
2
3
file
C:\PS> $hash1
Name Value
---- -----
a 1
b 2
c 3
C:\PS> $hash1 += @{e = 5}
C:\PS> $hash1
Name Value
---- -----
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 adaptar el resultado, como en el siguiente ejemplo:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
El tipo del resultado no necesariamente será el mismo que uno de los operandos. En el siguiente ejemplo, el valor negativo no se puede convertir en un entero sin signo y este es demasiado grande para convertirse en un Int32:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
En este ejemplo, Int64 puede adaptar ambos tipos.
El tipo System.Decimal es una excepción. Si alguno de los operandos es de tipo Decimal, el resultado será del tipo Decimal. Si el resultado es demasiado grande para el tipo Decimal, no se convertirá a Double. En su lugar, se producirá un error.
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
Value was either too large or too small for a Decimal.
At line:1 char:22
+ [Decimal]::maxvalue + <<<< 1
VARIABLES Y OPERADORES ARITMÉTICOS
También puede usar operadores aritméticos con variables. Los operadores actúan en los valores de las variables. En los siguientes ejemplos se muestra el uso de 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 PowerShell2
COMANDOS Y OPERADORES ARITMÉTICOS
Por lo general, los operadores aritméticos se usan en expresiones con números, cadenas y matrices. Sin embargo, también puede usar los operadores aritméticos con los objetos que devuelven los comandos y con las propiedades de dichos objetos.
En los siguientes ejemplos, se muestra cómo usar los operadores aritméticos en expresiones con comandos de Windows PowerShell:
C:\PS> get-date
Wednesday, January 02, 2008 1:28:42 PM
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
Thursday, January 03, 2008 1:34:52 PM
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
660 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 siguientes ejemplos, se muestra cómo usar 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"
Cannot convert value "w" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char: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 = "TestFiles.txt"
C:\PS> $b = "C:\Logs\"
C:\PS> $b + $a
C:\Logs\TestFiles.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"}
Name Value
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers
Name Value
---- -----
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers += @{3 = "Server03"} #Use assignment operator
C:\PS> $servers
Name Value
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
OPERACIONES ARITMÉTICAS BIT A BIT EN WINDOWS POWERSHELL
Windows PowerShell admite los operadores -shl (desplazamiento hacia la izquierda) y -shr (desplazamiento hacia la derecha) en las operaciones aritméticas bit a bit.
Estos operadores se introdujeron en Windows PowerShell 3.0.
En una operación de desplazamiento hacia la izquierda bit a bit, se mueven todos los bits "n" posiciones a la izquierda, donde "n" es el valor del operando derecho. Se inserta un cero en la posición del uno.
Cuando el operando izquierdo es un valor entero (32 bits), los 5 bits inferiores del operando derecho determinan cuántos bits del operando izquierdo se desplazan.
Cuando el operando izquierdo es un valor largo (64 bits), los 6 bits inferiores del operando derecho determinan cuántos bits del operando izquierdo se desplazan.
PS C:\> 21 -shl 1
42
00010101 (21)
00101010 (42)
PS C:\> 21 -shl 2
84
00010101 (21)
00101010 (42)
01010100 (84)
En una operación de desplazamiento hacia la derecha bit a bit, se mueven todos los bits "n" posiciones a la derecha, donde "n" se especifica con el operando derecho. El operador de desplazamiento hacia la derecha (-shr) inserta un cero en la posición situada más a la izquierda al desplazar a la derecha un valor positivo o sin signo.
Cuando el operando izquierdo es un valor entero (32 bits), los 5 bits inferiores del operando derecho determinan cuántos bits del operando izquierdo se desplazan.
Cuando el operando izquierdo es un valor largo (64 bits), los 6 bits inferiores del operando derecho determinan cuántos bits del operando izquierdo se desplazan.
PS C:\> 21 -shr 1
10
00010101 (21)
00001010 (10)
PS C:\> 21 -shr 2
5
00010101 (21)
00001010 (10)
00000101 ( 5)
VEA TAMBIÉN
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
Get-Date
New-TimeSpan