РАЗДЕЛ
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