Ó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