about_Operators

간단한 설명

PowerShell에서 지원하는 연산자를 설명합니다.

자세한 설명

연산자는 명령이나 식에서 사용할 수 있는 언어 요소입니다. PowerShell은 값을 조작하는 데 도움이 되는 여러 유형의 연산자를 지원합니다.

산술 연산자

산술 연산자(+, , -, */,%)를 사용하여 명령 또는 식의 값을 계산합니다. 이러한 연산자를 사용하면 값을 추가, 빼기, 곱하거나 나누기 및 나누기 연산의 re기본der(모듈러스)를 계산할 수 있습니다.

더하기 연산자는 요소를 연결합니다. 곱하기 연산자는 각 요소의 지정된 복사본 수를 반환합니다. 이러한 연산자를 구현하는 모든 .NET 형식에서 산술 연산자를 사용할 수 있습니다(예: Int, String, DateTimeHashtable배열).

비트 연산자(-band, , -bor-bxor, -bnot, -shr-shl)는 값의 비트 패턴을 조작합니다.

자세한 내용은 about_Arithmetic_Operators 참조하세요.

할당 연산자

할당 연산자(=,, +=, -=, *=, /=%=)를 사용하여 변수에 값을 할당, 변경 또는 추가합니다. 산술 연산자를 할당과 결합하여 산술 연산 결과를 변수에 할당할 수 있습니다.

자세한 내용은 about_Assignment_Operators 참조하세요.

비교 연산자

비교 연산자(-eq, , -ne, -gt-lt, -le) -ge를 사용하여 값과 테스트 조건을 비교합니다. 예를 들어 두 문자열 값을 비교하여 같은지 여부를 확인할 수 있습니다.

비교 연산자는 텍스트에서 패턴을 찾거나 바꾸는 연산자도 포함합니다. (-match, -notmatch, -replace) 연산자는 정규식을 사용하고 (-like, -notlike) wild카드를 *사용합니다.

포함 비교 연산자는 테스트 값이 참조 집합(-in, , -notin,-contains-notcontains)에 표시되는지 여부를 결정합니다.

형식 비교 연산자(-is, -isnot)는 개체가 지정된 형식인지 여부를 결정합니다.

자세한 내용은 about_Comparison_Operators 참조하세요.

논리 연산자

논리 연산자(-and, , -or, -not-xor) !를 사용하여 조건문을 단일 복합 조건부에 연결합니다. 예를 들어 논리 -and 연산자를 사용하여 서로 다른 두 조건을 가진 개체 필터를 만들 수 있습니다.

자세한 내용은 about_Logical_Operators 참조하세요.

리디렉션 연산자

리디렉션 연산자(>, >>, , 2>>2>2>&1)를 사용하여 명령 또는 식의 출력을 텍스트 파일로 보냅니다. 리디렉션 연산자는 매개 변수 없이 cmdlet처럼 Out-File 작동하지만 오류 출력을 지정된 파일로 리디렉션할 수도 있습니다. cmdlet을 사용하여 출력을 Tee-Object 리디렉션할 수도 있습니다.

자세한 내용은 about_Redirection 참조 하세요.

분할 및 조인 연산자

-split-join 연산자는 부분 문자열을 나누고 결합합니다. -split 연산자는 문자열을 부분 문자열로 분할합니다. 연산자는 -join 여러 문자열을 단일 문자열로 연결합니다.

자세한 내용은 about_Splitabout_Join 참조하세요.

형식 연산자

형식 연산자(-is, -isnot, -as)를 사용하여 개체의 .NET 형식을 찾거나 변경할 수 있습니다.

자세한 내용은 about_Type_Operators 참조하세요.

단항 연산자

단항 ++-- 연산자를 사용하여 값을 증가 또는 감소시키고 - 부정할 수 있습니다. 예를 들어 변수 $a9 를 증분하려면 .를 입력$a++합니다10.

자세한 내용은 about_Arithmetic_Operators 참조하세요.

특수 연산자

특수 연산자에는 다른 연산자 그룹에 맞지 않는 특정 사용 사례가 있습니다. 예를 들어 특수 연산자를 사용하면 명령을 실행하거나, 값의 데이터 형식을 변경하거나, 배열에서 요소를 검색할 수 있습니다.

그룹화 연산자 ( )

다른 언어와 마찬가지로 식 (...) 에서 연산자 우선 순위를 재정의하는 역할을 합니다. 예: (1 + 2) / 3

그러나 PowerShell에는 추가 동작이 있습니다.

결과 식 그룹화

(...)를 사용하면 명령의 출력이 식에 참여하도록 할 수 있습니다. 예시:

PS> (Get-Item *.txt).Count -gt 10
True

그룹화된 식 파이핑

파이프라인의 첫 번째 세그먼트로 사용되는 경우 명령이나 식을 괄호로 래핑하면 식 결과가 항상 열거 됩니다. 괄호가 명령을 래핑하면 결과가 파이프라인을 통해 전송되기 전에 메모리에 수집된 모든 출력으로 완료됩니다.

또한 파이핑 전에 식을 그룹화하면 후속 개체별 처리가 명령이 출력을 생성하는 데 사용하는 열거형을 방해할 수 없습니다.

할당 문 그룹화

그룹화되지 않은 대입 문은 값을 출력하지 않습니다. 할당 문을 그룹화할 때 할당된 변수의 값이 전달되며 더 큰 식에서 사용할 수 있습니다. 예시:

PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True

문을 괄호로 래핑하면 값을 $var출력하는 식으로 바뀝니다.

이 동작은 복합 연산자(예: +=복합 연산자) 및 증가() 및 감소(++--) 연산자를 비롯한 모든 할당 연산자에도 적용됩니다. 그러나 증가 및 감소에 대한 작업 순서는 해당 위치에 따라 달라집니다.

PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1

접두사에서 값 $i 은 출력되기 전에 증가합니다. 후위 사례에서 값 $i 은 출력된 후 증가합니다.

문과 같은 if 조건문의 컨텍스트에서 이 기술을 사용할 수도 있습니다.

if ($textFiles = Get-ChildItem *.txt) {
    $textFiles.Count
}

이 예제에서 일치하는 Get-ChildItem 파일이 없으면 명령은 아무 것도 반환하지 않고 부울 컨텍스트에서 고려되는 $false 아무 것도 할당하지 않습니다$textFiles. 하나 이상의 FileInfo 개체가 $textFiles할당된 경우 조건부 값은 .로 $true계산됩니다. 문 본문의 $textFiles 값을 사용하여 작업할 if 수 있습니다.

참고 항목

이 기술은 편리하고 간결하지만 대입 연산자()와 같음 비교 연산자(=-eq)가 혼동을 초래할 수 있습니다.

하위 식 연산자 $( )

하나 이상의 문의 결과를 반환합니다. 단일 결과의 경우 스칼라를 반환합니다. 여러 결과에 대해 배열을 반환합니다. 다른 식 내에서 식을 사용하려는 경우 이를 사용합니다. 예를 들어 명령 결과를 문자열 식에 포함할 수 있습니다.

PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20

PS> "Folder list: $((dir c:\ -dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows

배열 하위 식 연산자 @( )

하나 이상의 문의 결과를 배열로 반환합니다. 결과는 항상 0개 이상의 개체 배열입니다.

PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -eq Starting )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
0

해시 테이블 리터럴 구문 @{}

배열 하위 식과 마찬가지로 이 구문은 해시 테이블을 선언하는 데 사용됩니다. 자세한 내용은 about_Hash_Tables 참조하세요.

호출 연산자 &

명령, 스크립트 또는 스크립트 블록을 실행합니다. "호출 연산자"라고도 하는 호출 연산자를 사용하면 변수에 저장되고 문자열 또는 스크립트 블록으로 표현되는 명령을 실행할 수 있습니다. 호출 연산자는 자식 범위에서 실행됩니다. 범위에 대한 자세한 내용은 about_Scopes 참조하세요.

다음은 문자열에 명령을 저장하고 호출 연산자를 사용하여 실행하는 예제입니다.

PS> $c = "get-executionpolicy"
PS> $c
get-executionpolicy
PS> & $c
AllSigned

호출 연산자는 문자열을 구문 분석하지 않습니다. 즉, 호출 연산자를 사용할 때 문자열 내에서 명령 매개 변수를 사용할 수 없습니다.

PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.

Invoke-Expression cmdlet은 호출 연산자를 사용할 때 구문 분석 오류를 일으키는 코드를 실행할 수 있습니다.

PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.

PS> Invoke-Expression "1+1"
2

파일 이름을 사용하여 스크립트를 실행할 수 있습니다. 스크립트 파일에는 .ps1 실행 가능한 파일 확장명이 있어야 합니다. 경로에 공백이 있는 파일은 따옴표로 묶어야 합니다. 따옴표 붙은 경로를 실행하려고 하면 PowerShell은 스크립트를 실행하는 대신 따옴표 붙은 문자열의 내용을 표시합니다. 호출 연산자를 사용하면 파일 이름을 포함하는 문자열의 내용을 실행할 수 있습니다.

PS C:\Scripts> Get-ChildItem

    Directory: C:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/28/2018   1:36 PM             58 script name with spaces.ps1

PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!

스크립트 블록에 대한 자세한 내용은 about_Script_Blocks 참조하세요.

백그라운드 연산자 &

백그라운드에서 PowerShell 작업에서 파이프라인을 실행합니다. 이 연산자는 하위 셀에서 비동기적으로 명령 앞에 작업을 실행하는 UNIX 컨트롤 연산자 앰퍼샌드(&)와 유사하게 작동합니다.

이 연산자는 기능적으로 Start-Job. 기본적으로 백그라운드 연산자는 병렬 작업을 시작한 호출자의 현재 작업 디렉터리에서 작업을 시작합니다. 다음 예제에서는 백그라운드 작업 연산자의 기본 사용을 보여 줍니다.

Get-Process -Name pwsh &

이 명령은 다음 사용과 Start-Job기능적으로 동일합니다.

Start-Job -ScriptBlock {Get-Process -Name pwsh}

마찬가지로 Start-Job백그라운드 연산자는 & 개체를 반환합니다 Job . 이 개체는 작업을 시작하는 데 사용한 Start-Job 것처럼 사용할 수 Receive-Job 있습니다Remove-Job.

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

& 백그라운드 연산자는 UNIX 컨트롤 연산자 앰퍼샌드(&)와 마찬가지로 문 종결자이기도 합니다. 이렇게 하면 백그라운드 연산자 후에 추가 명령을 호출할 & 수 있습니다. 다음 예제에서는 백그라운드 연산자 다음에 추가 명령을 호출하는 방법을 & 보여 줍니다.

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

이는 다음 스크립트와 동일합니다.

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

여러 명령을 실행하려는 경우 각각 자체 백그라운드 프로세스에 있지만 모두 한 줄에만 각 명령 간에 배치 & 하면 됩니다.

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

PowerShell 작업에 대한 자세한 내용은 about_Jobs 참조하세요.

캐스트 연산자 [ ]

개체를 지정된 형식으로 변환하거나 제한합니다. 개체를 변환할 수 없으면 PowerShell에서 오류가 발생합니다.

[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'

캐스트 표기법을 사용하여 변수를 할당할 때 캐스트를 수행할 수도 있습니다.

쉼표 연산자 ,

이진 연산자로, 쉼표는 배열을 만들거나 생성되는 배열에 추가합니다. 식 모드에서 단항 연산자로 쉼표는 하나의 멤버만 있는 배열을 만듭니다. 멤버 앞에 쉼표 배치

$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)

Write-Output 인수가 예상되므로 식을 괄호 안에 넣어야 합니다.

점 소싱 연산자 .

스크립트가 만드는 함수, 별칭 및 변수가 현재 범위에 추가되어 기존 범위를 재정의하도록 현재 범위에서 스크립트를 실행합니다. 스크립트에서 선언한 매개 변수는 변수가 됩니다. 값이 지정되지 않은 매개 변수는 값이 없는 변수가 됩니다. 그러나 자동 변수 $args 는 유지됩니다.

. c:\scripts\sample.ps1 1 2 -Also:3

참고 항목

점 소싱 연산자 뒤에 공백이 잇습니다. 공간을 사용하여 현재 디렉터리를 나타내는 점(.) 기호와 점을 구분합니다.

다음 예제에서는 현재 디렉터리의 Sample.ps1 스크립트가 현재 범위에서 실행됩니다.

. .\sample.ps1

Format 연산자 -f

문자열 개체의 형식 메서드를 사용하여 문자열의 서식을 지정합니다. 연산자의 왼쪽에 서식 문자열을 입력하고 연산자의 오른쪽에 서식을 지정할 개체를 입력합니다.

"{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello      3.14

"0" 사용자 지정 지정자를 사용하여 숫자 값을 0으로 패딩할 수 있습니다. 다음 : 0의 수는 서식이 지정된 문자열을 패딩할 최대 너비를 나타냅니다.

"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365

중괄호({})를 서식이 지정된 문자열에 유지해야 하는 경우 중괄호를 두 배로 늘려 이스케이프할 수 있습니다.

"{0} vs. {{0}}" -f 'foo'
foo vs. {0}

자세한 내용은 String.Format 메서드 및 복합 서식 지정을 참조하세요.

인덱스 연산자 [ ]

배열 및 해시 테이블과 같은 인덱싱된 컬렉션에서 개체를 선택합니다. 배열 인덱스는 0부터 시작하므로 첫 번째 개체는 .로 [0]인덱싱됩니다. 음수 인덱스를 사용하여 마지막 값을 가져올 수도 있습니다. 해시 테이블은 키 값으로 인덱싱됩니다.

인덱스 목록이 지정된 경우 인덱스 연산자는 해당 인덱스에 해당하는 멤버 목록을 반환합니다.

PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object installedOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...

개체가 인덱싱된 컬렉션이 아닌 경우 인덱스 연산자를 사용하여 첫 번째 요소에 액세스하면 개체 자체가 반환됩니다. 첫 번째 요소 반환 $null이후의 인덱스 값입니다.

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

파이프라인 연산자 |

앞에 오는 명령의 출력을 뒤에 오는 명령으로 보냅니다("파이프"). 출력에 둘 이상의 개체("컬렉션")가 포함된 경우 파이프라인 연산자는 개체를 한 번에 하나씩 보냅니다.

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

파이프라인 체인 연산자 &&||

왼쪽 파이프라인의 성공에 따라 오른쪽 파이프라인을 조건부로 실행합니다.

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

자세한 내용은 About_Pipeline_Chain_Operators 참조하세요.

범위 연산자 ..

범위 연산자는 순차적 정수 또는 문자의 배열을 나타내는 데 사용할 수 있습니다. 범위 연산자가 조인한 값은 범위의 시작 및 끝 값을 정의합니다.

참고 항목

문자 범위에 대한 지원이 PowerShell 6에 추가되었습니다.

숫자 범위

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

범위를 역순으로 만들 수도 있습니다.

10..1
5..-5 | ForEach-Object {Write-Output $_}

범위의 시작 및 끝 값은 정수 또는 문자로 계산되는 식 쌍일 수 있습니다. 범위의 엔드포인트는 부호 있는 32비트 정수([int32])로 변환할 수 있어야 합니다. 값이 크면 오류가 발생합니다. 또한 범위가 배열에서 캡처되는 경우 결과 배열의 크기는 .로 [int]::MaxValue - 56제한됩니다. .NET에서 배열의 최대 크기입니다.

예를 들어 시작 및 끝 값에 열거형의 멤버를 사용할 수 있습니다.

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Important

결과 범위는 열거형 값으로 제한되지 않습니다. 대신 제공된 두 값 사이의 값 범위를 나타냅니다. 범위 연산자를 사용하여 열거형의 멤버를 안정적으로 나타낼 수는 없습니다.

문자 범위

문자 범위를 만들려면 문자를 따옴표로 묶습니다.

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

문자열에 문자 범위를 할당하면 문자열에 문자 배열을 할당하는 것과 동일하게 처리됩니다.

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

배열의 문자는 문자열에 조인됩니다. 문자는 기본 설정 변수의 값으로 $OFS 구분됩니다. 자세한 내용은 about_Preference_Variables 참조하세요.

배열의 문자 순서는 문자의 ASCII 값에 따라 결정됩니다. 예를 들어 ASCII 값 cX 은 각각 99 및 88입니다. 해당 범위는 역순으로 표시됩니다.

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

멤버 액세스 연산자 .

개체의 속성 및 메서드에 액세스합니다. 멤버 이름은 식일 수 있습니다.

$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }

PowerShell 3.0부터 구성원이 없는 목록 컬렉션 개체에서 연산자를 사용하는 경우 PowerShell은 해당 컬렉션의 항목을 자동으로 열거하고 각 컬렉션의 연산자를 사용합니다. 자세한 내용은 about_Member-Access_Enumeration 참조하세요.

정적 멤버 연산자 ::

.NET 클래스의 정적 속성 및 메서드를 호출합니다. 개체의 정적 속성 및 메서드를 찾으려면 cmdlet의 Static 매개 변수를 Get-Member 사용합니다. 멤버 이름은 식일 수 있습니다.

[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }

삼항 연산자 ? <if-true> : <if-false>

간단한 조건부 사례에서 문 대신 삼항 연산 if-else 자를 사용할 수 있습니다.

자세한 내용은 about_If 참조하세요.

Null 병합 연산자 ??

null 병합 연산 ?? 자는 null이 아닌 경우 왼쪽 피연산자의 값을 반환합니다. 그렇지 않으면 오른쪽 피연산자를 계산하고 그 결과를 반환합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ?? 연산자는 오른쪽 피연산자를 평가하지 않습니다.

$x = $null
$x ?? 100
100

다음 예제에서는 오른쪽 피연산자가 평가되지 않습니다.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Null 병합 대입 연산자 ??=

Null 병합 할당 연산자 ??=는 왼쪽 피연산자가 null이 아닌 것으로 평가되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당합니다. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ??= 연산자는 오른쪽 피연산자를 평가하지 않습니다.

$x = $null
$x ??= 100
$x
100

다음 예제에서는 오른쪽 피연산자가 평가되지 않습니다.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020

Null 조건부 연산자 ?.?[]

참고 항목

이 기능은 PowerShell 7.1에서 실험적 기능에서 일반 지원으로 이동되었습니다.

Null 조건 연산자는 해당 피연산자가 null이 아닌 것으로 평가되는 경우에만 멤버 액세스 ?. 또는 요소 액세스 ?[], 작업을 해당 피연산자에 적용할 수 있습니다. 그렇지 않으면 null을 반환합니다.

PowerShell을 사용하면 ?를 변수 이름에 포함할 수 있으므로 이러한 연산자를 사용하려면 변수 이름의 공식적인 사양이 필요합니다. 변수 이름에 포함되거나 변수 이름의 일부${a?}인 경우 ? 변수 이름 ${a} 주위에 중괄호({})를 사용해야 합니다.

참고 항목

변수 이름 구문 ${<name>} 은 하위 식 연산자를 $() 혼동해서는 안 됩니다. 자세한 내용은 about_Variables 변수 이름 섹션을 참조하세요.

다음 예제에서는 PropName 값이 반환됩니다.

$a = @{ PropName = 100 }
${a}?.PropName
100

다음 예제에서는 멤버 이름 PropName에 액세스하지 않고 null을 반환합니다.

$a = $null
${a}?.PropName

이 예제에서는 인덱싱된 요소의 값이 반환됩니다.

$a = 1..10
${a}?[0]
1

다음 예제에서는 인덱싱된 요소에 액세스하지 않고 null을 반환합니다.

$a = $null
${a}?[0]

참고 항목