about_Operators — PowerShell 연산자 총정리
about_Operators — PowerShell 연산자 총정리
명령이나 표현식에서 값을 다룰 때 꼭 필요한 연산자들이에요. PowerShell이 지원하는 연산자 종류를 쭉 훑어보고, 각각 언제 쓰면 좋은지 차근차근 살펴볼게요. 산술, 대입, 비교, 논리, 리다이렉션부터 특별 연산자까지, 실제 코드에서 바로 쓸 수 있는 예시와 함께 구성했어요.
출처: about_Operators — Microsoft Learn (PowerShell 7.6 기준)
본문
간단한 설명(Short description)
PowerShell이 지원하는 연산자에 대해 설명하는 문서예요.
자세한 설명(Long description)
**연산자(operator)**는 명령이나 표현식에서 사용할 수 있는 언어 구성 요소예요. PowerShell은 값을 자유롭게 다루도록 여러 종류의 연산자를 지원해요.
산술 연산자(Arithmetic operators)
값을 계산할 때는 산술 연산자(+, -, *, /, %)를 써요. 이 연산자들로 값을 더하고, 빼고, 곱하고, 나누고, 나눗셈의 나머지(모듈러스)도 구할 수 있어요.
덧셈 연산자는 요소를 이어 붙이고, 곱셈 연산자는 각 요소를 지정한 개수만큼 복제해서 돌려줘요. 산술 연산자는 이를 구현하고 있는 .NET 형식이라면 어디에든 쓸 수 있어요. 예를 들면 Int, String, DateTime, Hashtable, Array 같은 형식이죠.
비트 연산자(-band, -bor, -bxor, -bnot, -shl, -shr)는 값의 비트 패턴을 직접 조작해요.
더 자세한 내용은 about_Arithmetic_Operators를 참고해요.
대입 연산자(Assignment operators)
변수에 값을 대입하거나, 바꾸거나, 덧붙일 때는 대입 연산자(=, +=, -=, *=, /=, %=)를 사용해요. 산술 연산자와 대입을 조합하면, 산술 연산의 결과를 그대로 변수에 담을 수 있어요.
더 자세한 내용은 about_Assignment_Operators를 참고해요.
비교 연산자(Comparison operators)
값을 비교하거나 조건을 검사할 때는 비교 연산자(-eq, -ne, -gt, -lt, -le, -ge)를 써요. 예를 들어 두 문자열 값이 같은지 비교할 수 있죠.
비교 연산자에는 텍스트에서 패턴을 찾거나 바꾸는 연산자도 포함돼요. -match, -notmatch, -replace는 정규식을 쓰고, -like, -notlike는 *와 ? 같은 와일드카드를 사용해요.
포함 여부를 판단하는 비교 연산자(-in, -notin, -contains, -notcontains)는 검사 값이 참조 집합에 들어 있는지 확인해줘요.
형식 비교 연산자(-is, -isnot)는 어떤 개체가 특정 형식인지 판별해요.
더 자세한 내용은 about_Comparison_Operators를 참고해요.
논리 연산자(Logical operators)
조건문 여러 개를 하나의 복잡한 조건으로 연결할 때는 논리 연산자(-and, -or, -xor, -not, !)를 써요. 예를 들어 서로 다른 두 조건을 가진 개체 필터를 만들 때 논리 -and를 사용하면 되죠.
더 자세한 내용은 about_Logical_Operators를 참고해요.
리다이렉션 연산자(Redirection operators)
명령이나 표현식의 출력을 텍스트 파일로 보낼 때는 리다이렉션 연산자(>, >>, 2>, 2>>, 2>&1)를 사용해요. 리다이렉션 연산자는 매개 변수가 없는 Out-File cmdlet처럼 동작하지만, 오류 출력을 지정한 파일로 보낼 수도 있어요. 출력을 리다이렉트할 때는 Tee-Object cmdlet도 함께 사용할 수 있어요.
더 자세한 내용은 about_Redirection를 참고해요.
분할·결합 연산자(Split and join operators)
-split과 -join 연산자는 부분 문자열을 나누고 합쳐주는 역할을 해요. -split은 문자열을 부분 문자열로 쪼개고, -join은 여러 문자열을 하나의 문자열로 이어 붙여요.
더 자세한 내용은 about_Split와 about_Join을 참고해요.
형식 연산자(Type operators)
개체의 .NET 형식을 찾거나 바꿀 때는 형식 연산자(-is, -isnot, -as)를 사용해요.
더 자세한 내용은 about_Type_Operators를 참고해요.
단항 연산자(Unary operators)
값을 증가·감소시키려면 단항 ++와 --, 부정에는 -를 써요. 예를 들어 변수 $a를 9에서 10으로 늘리려면 $a++라고 입력하면 돼요.
특별 연산자(Special operators)
특별 연산자는 다른 연산자 그룹에 속하지 않는 특수한 용도가 있어요. 예를 들어 특별 연산자로 명령을 실행하거나, 값의 데이터 형식을 바꾸거나, 배열에서 요소를 꺼내올 수 있죠.
다른 언어와 마찬가지로 (...)는 표현식에서 연산자 우선순위를 바꾸는 데 쓰여요. 예를 들어 (1 + 2) / 3처럼요.
그런데 PowerShell에는 여기에 더해 추가적인 동작이 있어요.
(...)는 명령의 출력이 표현식의 일부로 참여할 수 있게 해줘요. 예를 들면:
PS> (Get-Item *.txt).Count -gt 10
True
파이프라인으로 보내는 괄호 묶기
괄호로 묶은 표현식을 파이프라인의 첫 구간으로 사용하면, 그 표현식의 결과가 반드시 열거(enumerate)돼요. 괄호가 명령을 감싸고 있다면, 그 명령은 결과가 파이프라인으로 보내지기 전에 메모리에 모두 모일 때까지 끝까지 실행되어요.
파이프로 보내기 전에 표현식을 묶어 두면, 이후 개체 단위 처리가 그 명령이 출력을 만들어내는 데 쓰는 열거 작업을 방해하지 못해요.
묶지 않은 대입문은 값을 출력하지 않아요. 대입문을 괄호로 묶으면 대입된 변수의 값이 통과해서 더 큰 표현식 안에서 사용될 수 있어요. 예를 들어:
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
접두사(prefix)의 경우에는 $i 값을 출력하기 전에 먼저 증가시켜요. 접미사(postfix)의 경우에는 값을 출력한 뒤에 $i를 증가시키죠.
이 기법은 if 문 같은 조건문 안에서도 쓸 수 있어요.
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
이 예시에서 일치하는 파일이 없으면 Get-ChildItem 명령은 아무것도 반환하지 않고 $textFiles에도 아무것도 대입하지 않아요. 불리언(boolean) 문맥에서는 이게 $false로 간주되죠. 반면 FileInfo 개체가 하나라도 $textFiles에 대입되면 조건은 $true가 돼요. 그러면 if 문 본문에서 $textFiles 값을 가지고 작업하면 돼요.
이 기법은 간결하고 편리하지만, 대입 연산자(=)와 같음 비교 연산자(-eq)를 혼동하기 쉬워질 수 있다는 점은 주의해야 해요.
하위 표현식 연산자 $( )
하나 이상의 문의 결과를 반환해요. 결과가 하나면 스칼라(scalar)로, 여러 개면 배열로 돌려줍니다. 다른 표현식 안에서 표현식을 쓰고 싶을 때 사용해요. 예를 들어 명령의 결과를 문자열 표현식 안에 끼워 넣을 때죠.
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를 참고해요.
호출 연산자 &
명령이나 스크립트, 스크립트블록을 실행해요. 호출 연산자(또는 호출(invocation) 연산자)는 변수에 저장했거나 문자열·스크립트블록으로 표현된 명령을 실행할 수 있게 해줘요. 호출 연산자는 자식 범위(child scope)에서 실행돼요. 범위에 대한 자세한 내용은 about_Scopes를 참고해요. 필요로 하는 명령·매개 변수·인자를 담은 문자열을 만든 뒤, 그 문자열을 마치 명령인 것처럼 호출하는 데 쓸 수 있어요. 이때 만드는 문자열은 명령줄에 직접 입력하는 명령과 같은 구문 분석 규칙을 따라야 해요. 자세한 내용은 about_Parsing에서 확인해요.
아래 예시는 명령을 문자열에 저장한 뒤 호출 연산자로 실행하는 모습이에요.
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를 참고해요.
Important — 이 연산자를 신뢰할 수 없는 데이터와 함께 사용하는 것은 보안 위험이에요. 이 연산자는 신뢰할 수 있는 데이터에만 사용해야 해요. 자세한 내용은 Validate All Inputs 문서를 참고해요.
백그라운드 연산자 &
파이프라인 앞의 내용을 PowerShell 작업(job)으로 백그라운드에서 실행해요. 이 연산자는 유닉스 제어 연산자 앰퍼샌드(&)와 비슷하게, 앞의 명령을 서브셸에서 비동기 작업으로 실행해요.
이 연산자는 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
백그라운드 연산자 &는 유닉스 제어 연산자 앰퍼샌드(&)처럼 명령문 종결자이기도 해요. 그래서 백그라운드 연산자 & 뒤에 추가 명령을 계속 호출할 수 있어요. 다음 예시는 백그라운드 연산자 & 뒤에 추가 명령을 호출하는 모습이에요.
$job = Get-Process -Name pwsh & Receive-Job $job -Wait
이것은 다음 스크립트와 동일해요.
$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를 참고해요.
캐스트 연산자 [type]
개체를 지정한 형식으로 변환하거나 제한해요. 개체를 변환할 수 없으면 PowerShell이 오류를 만들어요.
[datetime] '2/20/88' - [datetime] '1/20/88' -eq [timespan] '31'
캐스트 표기법(cast notation)으로 변수에 대입할 때도 캐스트를 수행할 수 있어요.
쉼표 연산자 ,
이항 연산자로 쓰이면 쉼표는 배열을 만들거나, 만들고 있는 배열에 요소를 덧붙여요. 식 모드에서 단항 연산자로 쓰이면, 쉼표는 요소가 한 개뿐인 배열을 만들어요. 요소 앞에 쉼표를 두면 되죠.
$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)
Write-Output은 인자를 기대하므로, 표현식을 괄호 안에 넣어야 해요.
점 소싱 연산자 .
현재 범위에서 스크립트를 실행해서, 그 스크립트가 만드는 함수·별칭·변수를 전부 현재 범위에 추가하고 기존 것을 덮어써요. 스크립트가 선언하는 매개 변수는 변수가 되고, 값이 주어지지 않은 매개 변수는 값이 없는 변수가 돼요. 다만 자동 변수 $args는 유지돼요.
. C:\scripts\sample.ps1 1 2 -Also:3
Note — 점 소싱 연산자 뒤에는 공백이 따라와요. 이 공백으로 연산자를 현재 디렉터리를 나타내는 점(
.) 기호와 구분해야 해요.
다음 예시는 현재 디렉터리의 Sample.ps1 스크립트를 현재 범위에서 실행해요.
. .\sample.ps1
형식 연산자 -f
.NET 복합 서식 지정 기능에 접근하게 해줘요. 복합 서식 문자열은 고정 텍스트와, 형식 항목(format item)이라 부르는 인덱스 자리 표시자가 섞여 있는 문자열이에요. 형식 항목들은 목록의 개체에 대응해요.
각 형식 항목은 다음과 같은 형태이고 다음 구성 요소로 이루어져 있어요.
{index[,alignment][:formatString]}
짝을 이루는 중괄호({와 })는 필수예요.
서식 지정 연산은 원래 고정 텍스트에 목록에 있는 개체의 문자열 표현을 섞어 넣은 결과 문자열을 만들어내요. 자세한 내용은 Composite Formatting을 참고해요.
복합 서식 문자열은 연산자 왼쪽에, 서식을 적용할 개체는 연산자 오른쪽에 입력해요.
"{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}
인덱스 연산자 [ ]
배열이나 해시 테이블 같은 인덱스 컬렉션에서 개체를 선택해요. 배열 인덱스는 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 값으로 정해져요. 예를 들어 c와 X의 ASCII 값은 각각 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을 참고해요.
멤버 액세스 연산자로 존재하지 않는 속성을 읽거나, 속성 getter 메서드가 예외를 던질 때 PowerShell은 오류 대신 $null을 돌려줘요. 이 동작은 속성 접근에만 해당해요. 이 동작은 다음을 명시하는 .NET 규칙 CA1065를 따르는 거예요.
속성은 기본적으로 스마트 필드예요. 그래서 가능한 한 필드처럼 동작해야 해요. 필드는 예외를 던지지 않으므로 속성도 예외를 던지면 안 돼요. 예외를 던지는 속성이 있다면, 그것을 메서드로 바꾸는 것을 고려해보세요.
메서드 호출(내부 get_<PropertyName>() 메서드를 직접 호출하는 것 포함)에서 던져진 예외는 억제되지 않아요.
정적 멤버 연산자 ::
.NET 클래스의 정적 속성과 메서드를 호출해요. 개체의 정적 속성·메서드를 찾으려면 Get-Member cmdlet의 Static 매개 변수를 사용해요. 멤버 이름은 표현식일 수도 있어요.
[datetime]::Now
'MinValue', 'MaxValue' | ForEach-Object { [int]:: $_ }
삼항 연산자 ? <if-true> : <if-false>
간단한 조건문의 경우 삼항 연산자를 if-else 문의 대체로 사용할 수 있어요.
더 자세한 내용은 about_If를 참고해요.
Null 병합 연산자 ??
왼쪽 피연산자가 null이 아니면 그 값을 돌려줘요. 그렇지 않으면 오른쪽 피연산자를 평가하고 그 결과를 반환해요. ?? 연산자는 왼쪽 피연산자가 null이 아닌 값으로 평가되면 오른쪽 피연산자를 평가하지 않아요.
$x = $null
$x ?? 100
100
다음 예시에서는 오른쪽 피연산자가 평가되지 않아요.
[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020
Null 병합 대입 연산자 ??=
왼쪽 피연산자가 null로 평가될 때에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입해요. ??= 연산자는 왼쪽 피연산자가 null이 아닌 값으로 평가되면 오른쪽 피연산자를 평가하지 않아요.
$x = $null
$x ??= 100
$x
100
다음 예시에서는 오른쪽 피연산자가 평가되지 않아요.
[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020
Null 조건부 연산자 ?.와 ?[]
Note — 이 기능은 PowerShell 7.1에서 실험 단계에서 주류(mainstream)로 전환되었어요.
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]
더 알아보기
- about_Arithmetic_Operators
- about_Assignment_Operators
- about_Comparison_Operators
- about_Logical_Operators
- about_Operator_Precedence
- about_Member-Access_Enumeration
- about_Type_Operators
- about_Split
- about_Join
- about_Redirection
원문 설명: 위 참고자료들은 각 연산자 그룹의 상세 문서예요. 기초를 익힌 뒤에는 필요할 때마다 해당 페이지로 찾아가서 더 깊이 살펴보면 좋아요.