РАЗДЕЛ about_Arithmetic_Operators КРАТКОЕ ОПИСАНИЕ Описание арифметических операторов, используемых в Windows PowerShell. ПОЛНОЕ ОПИСАНИЕ Арифметические операторы используются для вычисления числовых значений. Можно использовать один или несколько арифметических операторов для сложения, вычитания, умножения и деления значений, а также для вычисления остатка при операции деления. Кроме того, оператор сложения (+) и оператор умножения (*) также используются при работе со строками, массивами и хэш-таблицами. Оператор сложения объединяет введенные данные. Оператор умножения возвращает несколько копий входных данных. В арифметическом операторе могут даже использоваться объекты различных типов. Метод, используемый для вычисления результата оператора, определяется типом самого левого объекта в выражении. В Windows PowerShell поддерживаются следующие арифметические операторы. Оператор Описание Пример -------- ----------- ------- + Сложение целых чисел; объединение 6+2 строк, массивов и хэш-таблиц. "имя" + "файла" - Вычитание одного значения 6-2 из другого. (get-date).date - - Смена знака числа. -6+2 -4 * Умножение целых чисел; копирование 6*2 строк и массивов указанное "w" * 3 количество раз. / Деление одного значения на другое. 6/2 % Возврат остатка при операции деления. 7%2 ПРИОРИТЕТ ОПЕРАТОРОВ Windows PowerShell обрабатывает арифметические операторы в следующем порядке. Скобки () - (смена знака) *, /, % +, - (вычитание). Windows PowerShell обрабатывает выражения слева направо с учетом правил приоритета. В следующих примерах показано влияние правил приоритета на результат вычислений. 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 Порядок, в котором Windows PowerShell вычисляет результат выражений, может отличаться от других языков программирования и языков скриптов, с которыми вы работали. В следующем примере показан сложный оператор назначения. 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 В этом примере выражение $a++ вычисляется до выражения $c[$a++]. При вычислении $a++ значение переменной $a изменяется. Переменная $a в выражении $b[$a] равняет 1, а не 0, поэтому оператор назначает значение $b[1], а не $b[0]. СЛОЖЕНИЕ И УМНОЖЕНИЕ НЕЧИСЛОВЫХ ТИПОВ Можно складывать числа, строки, массивы и хэш-таблицы. Также можно умножать числа, строки и массивы. Однако, хэш-таблицы не могут использоваться в операторе умножения. При сложении строк, массивов или хэш-таблиц элементы объединяются. При объединении коллекций, например массивов или хэш-таблиц, создается новый объект, в котором содержатся объекты из обеих коллекций. При попытке объединения хэш-таблиц, содержащих общий ключ, операция завершается неудачей. Например, следующая команда создает два массива и выполняет их сложение: C:\PS> $a = 1,2,3 C:\PS> $b = "A","B,"C" C:\PS> $a + $b 1 2 3 A B C Можно также выполнять арифметические операции над объектами различных типов. Операция, которую попытается выполнить Windows PowerShell, определяется типом платформы Microsoft .NET Framework самого левого объекта, участвующего в операции. Windows PowerShell пытается преобразовать все объекты, участвующие в операции, в тип платформы Microsoft .NET Framework первого объекта. Если преобразование объектов завершается успешно, выполняется операция, соответствующая типу платформы Microsoft .NET Framework первого объекта. Если преобразовать любой из объектов не удается, операция завершается неудачей. В следующем примере показано использование операторов сложения и умножения в операциях с объектами различных типов. C:\PS> "файл" + 16 файл16 C:\PS> $array = 1,2,3 C:\PS> $array + 16 1 2 3 16 C:\PS> $array + "файл" 1 2 3 файл C:\PS> "файл" * 3 файлфайлфайл Поскольку метод, используемый для вычисления результата оператора, определяется типом самого левого объекта в выражении, сложение и умножение в Windows PowerShell не являются строго коммутативными. Например, (a + b) не всегда равняется (b + a), а (a * b) не всегда равняется (b * a). Этот принцип показан в следующем примере. C:\PS> "файл" + 2 файл2 C:\PS> 2 + "файл" Не удается преобразовать значение "файл" в тип "System.Int32". Ошибка: "Неверный формат строки ввода." В строке:1 знак:4 + 2 + <<<< "файл" C:\PS> "файл" * 3 файлфайлфайл C:\PS> 3 * "файл" Не удается преобразовать значение "файл" в тип "System.Int32". Ошибка: "Неверный формат строки ввода." В строке:1 знак:4 + 3 * <<<< "файл" Обработка хэш-таблиц выполняется несколько по-другому. Допускается сложение хэш-таблиц. Также можно добавить хэш-таблицу к массиву. Тем не менее, нельзя добавить переменную любого другого типа к хэш-таблице. В следующих примерах показано сложение хэш-таблиц друг с другом и с другими объектами. C:\PS> $hash1 = @{a=1; b=2; c=3} C:\PS> $hash2 = @{c1="Server01"; c2="Server02"} C:\PS> $hash1 + $hash2 Имя Значение ---- ----- c2 Server02 1 b 2 c1 Server01 3 C:\PS> $hash1 + 2 Можно добавить хеш-таблицу только к другой хеш-таблице. В строке:1 знак:9 + $hash1 + <<<< 2 C:\PS> 2 + $hash1 Не удается преобразовать "System.Collections.Hashtable" в "System.Int32". В строке:1 знак:4 + 2 + <<<< $hash1 В следующем примере показано, как добавить хэш-таблицу к массиву. Вся хэш-таблица добавляется к массиву как один объект. C:\PS> $array = 1,2,3 C:\PS> $array + $hash1 1 2 3 Имя Значение ---- ----- a 1 b 2 c 3 C:\PS> $sum = $array + $hash1 C:\PS> $sum.count 4 C:\PS> $sum[3] Имя Значение ---- ----- a 1 b 2 c 3 PS C:\ps-test> $sum + $hash2 1 2 3 Имя Значение ---- ----- a 1 b 2 c 3 c2 Server02 В следующем примере показано, что нельзя складывать хэш-таблицы, содержащие общий ключ. C:\PS> $hash1 = @{a=1; b=2; c=3} C:\PS> $hash2 = @{c="red"} C:\PS> $hash1 + $hash2 Неверный аргумент для оператора '+': Элемент уже был добавлен. Ключ в словаре: 'c' Добавляемый ключ: 'c'. В строке:1 знак:9 + $hash1 + <<<< $hash2 Хотя операторы сложения очень удобны, используйте операторы назначения для добавления элементов в хэш-таблицы и массивы. Дополнительные сведения см. в разделе about_assignment_operators. В следующих примерах показано использование оператора назначения += для добавления элементов в массив: C:\PS> $array 1 2 3 C:\PS> $array + "файл" 1 2 3 файл C:\PS> $array 1 2 3 C:\PS> $array += "файл" C:\PS> $array 1 2 3 файл C:\PS> $hash1 Имя Значение ---- ----- a 1 b 2 c 3 C:\PS> $hash1 += @{e = 5} C:\PS> $hash1 Имя Значение ---- ----- a 1 b 2 e 5 c 3 Windows PowerShell автоматически выбирает числовой тип платформы .NET Framework, который позволит оптимально представить результат без снижения точности. Пример: C:\PS> 2 + 3.1 5.1 C:\PS> (2). GetType().FullName System.Int32 C:\PS> (2 + 3.1).GetType().FullName System.Double Если результат операции оказывается слишком велик для определенного типа, то тип результата расширяется для размещения результата (см. следующий пример). C:\PS> (512MB).GetType().FullName System.Int32 C:\PS> (512MB * 512MB).GetType().FullName System.Double Тип результата не обязательно совпадает с типом одного из операндов. В следующем примере невозможно преобразовать отрицательное значение в целое без знака, а целое число без знака слишком велико, чтобы преобразовать его в Int32. C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname System.Int64 В этом примере Int64 позволяет разместить значения обоих типов. Исключением является тип System.Decimal. Если любой из операндов принадлежит к типу Decimal, результата также будет принадлежать к типу Decimal. Если результат окажется слишком велик для типа Decimal, он не будет преобразован в тип Double. Вместо этого будет выдано сообщение об ошибке. C:\PS> [Decimal]::maxvalue 79228162514264337593543950335 C:\PS> [Decimal]::maxvalue + 1 Значение слишком велико или слишком мало для типа Decimal. В строке:1 знак:22 + [Decimal]::maxvalue + <<<< 1 АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ И ПЕРЕМЕННЫЕ Арифметические операторы могут также использоваться с переменными. Операторы используют значения переменных. В следующих примерах показано использование арифметических операторов с переменными. 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 АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ И КОМАНДЫ Обычно арифметические операторы используются в выражениях с числами, строками и массивами. Однако, арифметические операторы могут также использоваться с объектами, возвращаемыми командами, и со свойствами этих объектов. В следующих примерах показано, как использовать арифметические операторы в выражениях с командами Windows PowerShell. C:\PS> get-date Среда, 02 января 2008 г., 13:28:42 C:\PS> $day = new-timespan -day 1 C:\PS> get-date + $day Четверг, 03 января 2008 г., 13:34:52 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 ПРИМЕРЫ В следующих примерах показано, как использовать арифметические операторы в 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" Не удается преобразовать значение "w" в тип "Systm.Int32". Ошибка: "Неверный формат строки ввода." В строке:1 знак: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"} Имя Значение ---- ----- 3 Server03 2 Server02 1 Server01 0 LocalHost C:\PS> $servers Имя Значение ---- ----- 2 Server02 1 Server01 0 LocalHost C:\PS> $servers += @{3 = "Server03"} #Используйте оператор назначения C:\PS> $servers Имя Значение ---- ----- 3 Server03 2 Server02 1 Server01 0 LocalHost СМ. ТАКЖЕ about_arrays about_assignment_operators about_comparison_operators about_hash_tables about_operators about_variables Get-Date New-TimeSpan