ÓPICO
about_Arithmetic_Operators
DESCRIÇÃO RESUMIDA
Descreve os operadores que executam aritmética no Windows PowerShell.
DESCRIÇÃO LONGA
Operadores aritméticos calculam valores numéricos. Você pode usar
um ou mais operadores aritméticos para somar, subtrair,
multiplicar e dividir valores, bem como para calcular o resto
(módulo) de uma operação de divisão.
Além disso, o operador de adição (+) e o operador de
multiplicação (*) também funciona em cadeias de caracteres,
matrizes e tabelas de hash. O operador de adição concatena a
entrada. O operador de multiplicação retorna várias cópias da
entrada. Você pode até mesmo misturar tipos de objetos em uma
instrução aritmética.
O método usado para avaliar a instrução é determinado pelo tipo
do objeto mais à esquerda na expressão.
O Windows PowerShell oferece suporte aos seguintes operadores
aritméticos:
Operador Descrição Exemplo
-------- ----------- -------
+ Adiciona inteiros; concatena cadeias 6+2
de caracteres, matrizes e tabelas de "nome" + "arquivo"
hash.
- Subtrai um valor de outro. 6-2
(get-date).date - 1
- Torna um número negativo. -6+2
-4
* Multiplica inteiros; copia cadeias 6*2
de caracteres e matrizes o número "w" * 3
especificado de vezes.
/ Divide dois valores. 6/2
% Retorna o resto de uma operação de 7%2
divisão.
PRECEDÊNCIA DE OPERADOR
O Windows PowerShell processa operadores aritméticos na seguinte
ordem:
Parênteses ()
- (para um número negativo)
*, /, %
+, - (para subtração)
O Windows PowerShell processa as expressões da esquerda para a
direita de acordo com as regras de precedência. Os exemplos a
seguir mostram o efeito das regras de precedência:
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
A ordem na qual o Windows PowerShell avalia expressões pode
diferir de outras linguagens de programação e scripts que você
usou. O exemplo a seguir mostra uma instrução de atribuição
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
Neste exemplo, a expressão $a++ é avaliada antes de $c[$a++].
A avaliação de $a++ altera o valor de $a. A variável $a em $b[$a] é
igual a 1, não 0, de modo que a instrução atribua um valor a
$b[1], não a $b[0].
SOMANDO E MULTIPLICANDO TIPOS NÃO-NUMÉRICOS
Você pode somar números, cadeias de caracteres, matrizes e
tabelas de hash. E pode multiplicar números, cadeias de
caracteres e matrizes. Porém, não é possível multiplicar tabelas
de hash.
Quando você soma cadeias de caracteres, matrizes ou tabelas de
hash, os elementos são concatenados. Quando você concatena
conjuntos, como matrizes ou tabelas de hash, um novo objeto é
criado e contém os objetos de ambos os conjuntos. Se você tentar
concatenar tabelas de hash que têm a mesma chave, a operação falhará.
Por exemplo, os comandos a seguir criam duas matrizes e, em
seguida, as soma:
C:\PS> $a = 1,2,3
C:\PS> $b = "A","B,"C"
C:\PS> $a + $b
1
2
3
A
B
C
Você também pode executar operações aritméticas em objetos de
tipos diferentes. A operação que o Windows PowerShell executa é
determinada pelo tipo do Microsoft .NET Framework do objeto mais
à esquerda na operação.
O Windows PowerShell tenta converter todos os objetos na operação
para o tipo do .NET Framework do primeiro objeto. Se a conversão
dos objetos for bem-sucedida, a operação apropriada será executada
para o tipo do .NET Framework do primeiro objeto. Se a conversão
de qualquer objeto falhar, a operação falhará.
O exemplo a seguir demonstra o uso dos operadores de adição e
multiplicação em operações que incluem tipos de objeto diferentes:
C:\PS> "arquivo" + 16
arquivo16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "arquivo"
1
2
3
arquivo
C:\PS> "arquivo" * 3
arquivoarquivoarquivo
Como o método usado para avaliar instruções é determinado pelo
objeto mais à esquerda, a adição e a multiplicação no Windows
PowerShell não são totalmente comutativas. Por exemplo, (a + b)
não é sempre igual a (b + a) e (a * b) nem sempre é igual a (b * a).
Os exemplos a seguir demonstram esse princípio:
C:\PS> "arquivo" + 2
arquivo2
C:\PS> 2 + "arquivo"
Não é possível converter o valor "arquivo" para o tipo
"System.Int32". Erro: "A cadeia de caracteres de entrada não
está em um formato correto".
At line:1 char:4
+ 2 + <<<< "arquivo"
C:\PS> "arquivo" * 3
arquivoarquivoarquivo
C:\PS> 3 * "arquivo"
Não é possível converter o valor "arquivo" para o tipo
"System.Int32". Erro: "A cadeia de caracteres de entrada não
está em um formato correto".
At line:1 char:4
+ 3 * <<<< "arquivo"
As tabelas de hash são um caso ligeiramente diferente. Você pode
somar tabelas de hash. E pode adicionar uma tabela de hash a uma
matriz. Porém, não é possível adicionar qualquer outro tipo a uma
tabela de hash.
Os exemplos a seguir mostram como adicionar tabelas de hash entre
si e a outros objetos:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}
C:\PS> $hash1 + $hash2
Nome Valor
---- -----
c2 Server02
a 1
b 2
c1 Server01
c 3
C:\PS> $hash1 + 2
Você pode adicionar outra tabela de hash somente a uma tabela
de hash.
At line:1 char:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
Não é possível converter "System.Collections.Hashtable" em
"System.Int32".
At line:1 char:4
+ 2 + <<<< $hash1
Os exemplos a seguir demonstram que você pode adicionar uma
tabela de hash a uma matriz. A tabela de hash inteira é
adicionada à matriz como um único objeto.
C:\PS> $array = 1,2,3
C:\PS> $array + $hash1
1
2
3
Nome Valor
---- -----
a 1
b 2
c 3
C:\PS> $sum = $array + $hash1
C:\PS> $sum.count
4
C:\PS> $sum[3]
Nome Valor
---- -----
a 1
b 2
c 3
PS C:\ps-test> $sum + $hash2
1
2
3
Nome Valor
---- -----
a 1
b 2
c 3
c2 Server02
O exemplo a seguir mostra que você não pode adicionar tabelas de
hash que contenham a mesma chave:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c="red"}
C:\PS> $hash1 + $hash2
Argumento incorreto para o operador '+': O item já foi
adicionado. Chave contida no dicionário: 'c'; chave sendo
adicionada: 'c'.
At line:1 char:9
+ $hash1 + <<<< $hash2
Embora os operadores de adição sejam muito úteis, use os operadores de
atribuição para adicionar elementos a tabelas de hash e matrizes.
Para obter mais informações, consulte about_assignment_operators. Os
exemplos a seguir usam o operador de atribuição += para adicionar
itens a uma matriz:
C:\PS> $array
1
2
3
C:\PS> $array + "arquivo"
1
2
3
arquivo
C:\PS> $array
1
2
3
C:\PS> $array += "arquivo"
C:\PS> $array
1
2
3
arquivo
C:\PS> $hash1
Nome Valor
---- -----
a 1
b 2
c 3
C:\PS> $hash1 += @{e = 5}
C:\PS> $hash1
Nome Valor
---- -----
a 1
b 2
e 5
c 3
O Windows PowerShell seleciona automaticamente o tipo numérico do .NET
Framework que melhor expressa o resultado sem perder precisão. Por
exemplo:
C:\PS> 2 + 3.1
5.1
C:\PS> (2). GetType().FullName
System.Int32
C:\PS> (2 + 3.1).GetType().FullName
System.Double
Se o resultado de uma operação for muito grande para o tipo, o tipo do
resultado será ampliado para acomodar o resultado, como no exemplo a
seguir:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
O tipo de resultado não necessariamente será igual ao de um dos
operandos. No exemplo a seguir, o valor negativo não pode ser
convertido em um inteiro sem sinal, e o inteiro sem sinal é muito
grande para ser convertido em Int32:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
Neste exemplo, o Int64 pode acomodar ambos os tipos.
O tipo System.Decimal é uma exceção. Se um dos operandos tiver o
tipo Decimal, o resultado será do tipo Decimal. Se o resultado
for muito grande para o tipo Decimal, ele não será convertido em
Double. Ao contrário, ocorrerá um erro.
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
O valor era muito grande ou muito pequeno para Decimal.
At line:1 char:22
+ [Decimal]::maxvalue + <<<< 1
OPERADORES ARITMÉTICOS E VARIÁVEIS
Você também pode usar operadores aritméticos com variáveis. Os
operadores atuam nos valores das variáveis. Os exemplos a seguir
demonstram o uso de operadores aritméticos com variáveis:
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 E COMANDOS
Normalmente, você usa os operadores aritméticos em expressões com
números, cadeias de caracteres e matrizes. Porém, você também
pode usar operadores aritméticos com os objetos que os comandos
retornam e com as propriedades desses objetos.
Os exemplos a seguir mostram como usar os operadores aritméticos
em expressões com comandos do Windows PowerShell:
C:\PS> get-date
Quarta-feira, 02 de janeiro de 2008 1:28:42 PM
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
Quinta-feira, 03 de janeiro de 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
EXEMPLOS
Os exemplos a seguir mostram como usar os operadores aritméticos
no 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"
Não é possível converter o valor "w" para o tipo "System.Int32". Erro: "A
cadeia de caracteres de entrada não está em um formato correto".
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 = "ArquivosTeste.txt"
C:\PS> $b = "C:\Logs\"
C:\PS> $b + $a
C:\Logs\ArquivosTeste.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"}
Nome Valor
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers
Nome Valor
---- -----
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers += @{3 = "Server03"} #Usar operador de atribuição
C:\PS> $servers
Nome Valor
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
CONSULTE TAMBÉM
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
New-TimeSpan