about_Arithmetic_Operators

업데이트 날짜: 2014년 5월

적용 대상: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

여기에 소개를 삽입합니다.

항목

about_arithmetic_operators

간단한 설명

Windows PowerShell®에서 연산을 수행하는 연산자에 대해 설명합니다.

자세한 설명

산술 연산자는 숫자 값을 계산합니다. 하나 이상의 산술 연산자를 사용하여 값을 더하고, 빼고, 곱하고 및 나눌 수 있고, 나누기 연산의 나머지(모듈러스)를 계산할 수 있습니다.

또한 더하기 연산자(+) 및 곱하기 연산자(*)는 문자열, 배열 및 해시 테이블에 대해서도 작동합니다. 더하기 연산자는 입력을 연결합니다. 곱하기 연산자는 입력을 여러 번 복사해서 반환합니다. 산술 문에서 개체 형식을 혼합할 수도 있습니다. 식을 평가하는 데 사용되는 방법은 식의 맨 왼쪽 개체의 형식에 따라 결정됩니다.

Windows PowerShell 2.0부터는 모든 산술 연산자가 64비트 숫자에 작동합니다.

Windows PowerShell 3.0부터는 Windows PowerShell의 비트 산술을 지원하기 위해 -shr(오른쪽으로 이동) 및-shl(왼쪽으로 이동)이 추가됩니다.

Windows PowerShell에서는 다음과 같은 산술 연산자를 지원합니다.

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

연산자 우선 순위

Windows PowerShell은 다음과 같은 순서로 산술 연산자는 처리합니다.

        Parentheses ()
        - (for a negative number)
        *, /, %
        +, - (for subtraction)

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의 값이 변경됩니다. $b[$a]의 변수 $a는 0이 아닌 1이므로 이 문은 $b[0]가 아닌 $b[1]에 값을 대입합니다.

나누기 및 반올림

나누기 연산의 몫이 정수이면 Windows PowerShell는 값을 가장 가까운 정수로 반올림합니다. 값이 .5이면 가장 가까운 짝수 정수로 반올림합니다.

다음 예제에서는 가장 가까운 짝수 정수로 반올림할 때의 결과를 보여 줍니다.

C:\PS> [int]( 5 / 2 )
        2

C:\PS> [int]( 7 / 2 )
        4

비숫자 형식의 더하기 및 곱하기

숫자, 문자열, 배열 및 해시 테이블을 더할 수 있습니다. 또한 숫자, 문자열 및 배열을 곱할 수 있습니다. 그러나 해시 테이블은 곱할 수 없습니다.

문자열, 배열 또는 해시 테이블에 더하면 요소가 연결됩니다. 배열 또는 해시 테이블 등의 컬렉션을 연결하면 두 컬렉션의 개체를 포함하는 새 개체가 만들어집니다. 동일한 키가 들어 있는 해시 테이블을 연결하려고 하면 작업이 실패합니다.

예를 들어 다음 명령은 두 배열을 만든 후 더합니다.

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에서는 연산의 모든 개체를 첫 번째 개체의 .NET Framework 형식으로 변환하려고 합니다. 개체 변환이 성공적으로 수행되면 첫 번째 개체의 .NET Framework 형식에 적합한 연산이 수행됩니다. 개체 변환에 실패하면 연산이 실패합니다.

다음 예제에서는 서로 다른 개체 형식을 포함하는 연산에서 더하기 및 곱하기 연산자의 사용을 보여 줍니다.

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

문을 평가하는 데 사용되는 방법은 맨 왼쪽 개체에 따라 결정되므로 Windows PowerShell의 더하기 및 곱하기는 엄밀히 말해 교환 가능하지 않습니다. 예를 들어 (a + b)가 항상 (b + a)와 같은 것은 아니며 (a * b)가 항상 (b * a)와 같은 것은 아닙니다.

다음 예제에서는 이 원칙을 보여 줍니다.

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"

해시 테이블은 약간 다른 경우입니다. 해시 테이블을 더할 수 있습니다. 또한 배열에 해시 테이블을 더할 수 있습니다. 그러나 다른 형식을 해시 테이블에 더할 수는 없습니다.

다음 예제에서는 해시 테이블끼리 더하는 방법 및 해시 테이블을 다른 형식에 더하는 방법을 보여 줍니다.

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

다음 예제에서는 해시 테이블을 배열에 더할 수 있다는 것을 보여 줍니다. 전체 해시 테이블이 단일 개체로 배열에 더해집니다.

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

다음 예제에서는 동일한 키를 포함하는 해시 테이블을 추가할 수 없다는 것을 보여 줍니다.

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

더하기 연산자는 매우 유용하지만 대입 연산자를 사용하여 해시 테이블 및 배열에 요소를 추가합니다. 자세한 내용은 about_assignment_operators를 참조하세요. 다음 예제에서는 += 할당 연산자를 사용하여 배열에 항목을 더합니다.

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에서는 정밀도 손실 없이 결과를 나타내는 .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 형식은 예외입니다. 10진수 형식의 피연산자가 있으면 결과는 10진수 형식이 됩니다. 결과가 10진수 형식에 비해 너무 크면 Double로 캐스팅되지 않습니다. 대신 오류가 발생합니다.

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

산술 연산자 및 변수

또한 산술 연산자에 변수를 사용할 수도 있습니다. 이 연산자는 변수 값에 작동합니다. 다음 예제에서는 산술 연산자와 변수의 사용을 보여 줍니다.

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

산술 연산자 및 명령

일반적으로 숫자, 문자열 및 배열이 있는 식에서 산술 연산자를 사용합니다. 그러나 산술 연산자와 명령이 반환하는 개체 및 해당 개체의 속성을 사용할 수도 있습니다.

다음 예제에서는 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

예제

다음 예제에서는 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

WINDOWS POWERSHELL의 비트 산술

Windows PowerShell에서는 비트 산술에 대해-shl(왼쪽으로 이동) 및 -shr(오른쪽으로 이동) 연산자를 지원합니다.

이러한 연산자는 Windows PowerShell 3.0부터 도입되었습니다.

비트 왼쪽으로 이동 연산에서 모든 비트는 왼쪽으로 "n" 위치로 이동됩니다. 여기서 "n"은 오른쪽 피연산자의 값입니다. 1 위치에 0이 삽입됩니다.

왼쪽 피연산자가 정수(32비트) 값이면 이동되는 왼쪽 피연산자의 비트 수는 오른쪽 피연산자의 아래쪽 5비트에 따라 결정됩니다.

왼쪽 피연산자가 Long(64비트) 값이면 이동되는 왼쪽 피연산자의 비트 수는 오른쪽 피연산자의 아래쪽 6비트에 따라 결정됩니다.

PS C:\> 21 -shl 1
42

00010101  (21)
00101010  (42)

PS C:\> 21 -shl 2
84

00010101  (21)
00101010  (42)
01010100  (84)

비트 오른쪽으로 이동 연산에서 모든 비트는 오른쪽으로 "n" 위치로 이동됩니다. 여기서 "n"은 오른쪽 피연산자로 지정됩니다. 오른쪽으로 이동 연산자(-shr)는 양수 또는 부호 없는 값을 오른쪽으로 이동할 때 맨 왼쪽 위치에 0을 삽입합니다.

왼쪽 피연산자가 정수(32비트) 값이면 이동되는 왼쪽 피연산자의 비트 수는 오른쪽 피연산자의 아래쪽 5비트에 따라 결정됩니다.

왼쪽 피연산자가 Long(64비트) 값이면 이동되는 왼쪽 피연산자의 비트 수는 오른쪽 피연산자의 아래쪽 6비트에 따라 결정됩니다.

PS C:\> 21 -shr 1
10

00010101  (21)
00001010  (10)

PS C:\> 21 -shr 2
5

00010101  (21)
00001010  (10)
00000101  ( 5)

참고 항목

about_arrays

about_assignment_operators

about_comparison_operators

about_hash_tables

about_operators

about_variables

Get-Date

Get-Date

New-TimeSpan