about_Arithmetic_Operators

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.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