about_Comparison_Operators

간단한 설명

PowerShell의 비교 연산자는 두 값을 비교하거나 컬렉션의 요소를 입력 값과 필터링할 수 있습니다.

자세한 설명

비교 연산자를 사용하면 값을 비교하거나 지정된 패턴과 일치하는 값을 찾을 수 있습니다. PowerShell에는 다음과 같은 비교 연산자가 포함됩니다.

등호

  • -eq, -ieq- -ceq 같음
  • -ne, -ine- -cne 같지 않음
  • -gt, -igt- -cgt 보다 큼
  • -ge, -ige-cge - 크거나 같음
  • -lt, -ilt- -clt 보다 작음
  • -le, -ile- -cle 작거나 같음

일치

  • -like, -ilike-clike - 문자열이 wild카드 패턴과 일치합니다.
  • -notlike, -inotlike-cnotlike - 문자열이 wild카드 패턴과 일치하지 않습니다.
  • -match, -imatch-cmatch - 문자열이 regex 패턴과 일치합니다.
  • -notmatch, -inotmatch-cnotmatch - 문자열이 regex 패턴과 일치하지 않음

대체 기능

  • -replace, -ireplace- -creplace regex 패턴과 일치하는 문자열을 대체합니다.

억제

  • -contains, -icontains- -ccontains 컬렉션에 값이 포함됩니다.
  • -notcontains, -inotcontains- -cnotcontains 컬렉션에 값이 없습니다.
  • -in - 값이 컬렉션에 있습니다.
  • -notin - 컬렉션에 값이 없습니다.

Type

  • -is - 두 개체 모두 동일한 형식입니다.
  • -isnot - 개체가 동일한 형식이 아닙니다.

일반 기능

명시적 대/소문자 구분 연산자를 사용하지 않는 한 문자열 비교는 대/소문자를 구분하지 않습니다. 비교 연산자를 대/소문자를 구분하려면 다음을 c 추가합니다 -. 예를 들어 대/ -ceq 소문자를 구분하는 버전의 -eq. 대/소문자를 구분하지 않도록 하려면 다음-i 추가합니다. 예를 들어 명시적으로 -ieq 대/소문자를 구분하지 않는 버전입니다 -eq.

문자열 비교는 대/소문자를 구분하고 대/소문자를 구분하지 않는 비교에 InvariantCulture를 사용합니다. 비교는 유니코드 코드 포인트 간이며 문화권별 데이터 정렬 순서를 사용하지 않습니다. 결과는 현재 문화권에 관계없이 동일합니다.

연산자의 입력이 스칼라 값이면 연산자는 부울 값을 반환합니다. 입력이 컬렉션인 경우 연산자는 식의 오른쪽 값과 일치하는 컬렉션의 요소를 반환합니다. 컬렉션에 일치하는 항목이 없으면 비교 연산자는 빈 배열을 반환합니다. 예시:

$a = (1, 2) -eq 3
$a.GetType().Name
$a.Count
Object[]
0

몇 가지 예외도 있습니다.

  • 포함 및 형식 연산자는 항상 부울 값을 반환합니다.
  • -replace 연산자는 대체 결과를 반환합니다.
  • 식의 왼쪽이 -match$Matches 컬렉션이 아닌 경우 및 -notmatch 연산자도 자동 변수를 채웁다.

같음 연산자

-eq 및 -ne

왼쪽이 스칼라 -eq 이면 오른쪽이 같으면 True를 반환하고, 그렇지 않으면 -eq False를 반환합니다. -ne는 그 반대입니다. 양쪽이 같으면 False를 반환하고, -ne 그렇지 않으면 True를 반환합니다.

예시:

2 -eq 2                 # Output: True
2 -eq 3                 # Output: False
"abc" -eq "abc"         # Output: True
"abc" -eq "abc", "def"  # Output: False
"abc" -ne "def"         # Output: True
"abc" -ne "abc"         # Output: False
"abc" -ne "abc", "def"  # Output: True

왼쪽이 컬렉션 -eq 인 경우 오른쪽과 일치하는 멤버를 반환하고 -ne 필터링합니다.

예시:

1,2,3 -eq 2             # Output: 2
"abc", "def" -eq "abc"  # Output: abc
"abc", "def" -ne "abc"  # Output: def

이러한 연산자는 컬렉션의 모든 요소를 처리합니다. 예시:

"zzz", "def", "zzz" -eq "zzz"
zzz
zzz

같음 연산자는 다른 형식의 개체를 비교할 수 있습니다. 비교의 오른쪽에 있는 값을 비교를 위해 왼쪽 값의 형식으로 변환할 수 있음을 이해하는 것이 중요합니다.

예를 들어 문자열 '1.0' 은 값 1과 비교할 정수로 변환됩니다. 이 예제에서는 .를 반환합니다 True.

PS> 1 -eq '1.0'
True

이 예제에서 값 1 은 문자열과 비교할 문자열 '1.0'로 변환됩니다. 이 예제에서는 .를 반환합니다 False.

PS> '1.0' -eq 1
False

같음 연산자는 스칼라 또는 컬렉션뿐만 아니라 두 개체를 허용합니다. 그러나 비교 결과가 최종 사용자에게 의미가 있다고 보장되지는 않습니다. 다음 예제에서는 문제를 보여 줍니다.

class MyFileInfoSet {
    [String]$File
    [Int64]$Size
}
$a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$a -eq $b
False

이 예제에서는 동일한 속성을 가진 두 개의 개체를 만들었습니다. 그러나 같음 테스트 결과는 서로 다른 개체이기 때문에 False입니다. 비슷한 클래스를 만들려면 클래스에서 System.IEquatable<T>를 구현해야 합니다. 다음 예제에서는 System.IEquatable T를 구현하고 파일크기라는 두 가지 속성을 포함하는 MyFileInfoSet 클래스의 부분 구현을 보여 줍니다.>< 이 메서드는 Equals()MyFileInfoSet 개체의 파일 및 크기 속성이 같으면 True를 반환합니다.

class MyFileInfoSet : System.IEquatable[Object] {
    [String]$File
    [Int64]$Size

    [bool] Equals([Object] $obj) {
        return ($this.File -eq $obj.File) -and ($this.Size -eq $obj.Size)
    }
}
$a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$a -eq $b
True

임의 개체를 비교하는 눈에 띄는 예는 null인지 확인하는 것입니다. 그러나 변수 $null가 있는지 여부를 확인해야 하는 경우 같음 연산자의 왼쪽에 배치 $null 해야 합니다. 오른쪽에 배치하는 것은 당신이 기대하는 것을하지 않습니다.

예를 들어 null 요소를 포함하는 배열을 사용할 수 있습니다 $a .

$a = 1, 2, $null, 4, $null, 6

null이 $a 아닌 다음 테스트입니다.

$null -ne $a
True

그러나 다음 파일은 다음에서 $a모든 null 요소를 제거합니다.

$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6

-gt, -ge, -lt 및 -le

-gt, -ge, -lt-le 매우 유사하게 동작합니다. 양쪽이 스칼라인 경우 양측이 비교하는 방법에 따라 True 또는 False를 반환합니다.

연산자 다음 경우 True를 반환합니다.
-gt 왼쪽이 더 큽
-ge 왼쪽이 크거나 같음
-lt 왼쪽이 더 작습니다.
-le 왼쪽이 작거나 같음

다음 예제에서는 모든 문이 True를 반환합니다.

8 -gt 6  # Output: True
8 -ge 8  # Output: True
6 -lt 8  # Output: True
8 -le 8  # Output: True

참고 항목

대부분의 프로그래밍 언어에서 보다 큰 연산자는 >. PowerShell에서 이 문자는 리디렉션에 사용됩니다. 자세한 내용은 about_Redirection 참조하세요.

왼쪽이 컬렉션인 경우 이러한 연산자는 컬렉션의 각 멤버를 오른쪽과 비교합니다. 논리에 따라 멤버를 유지하거나 카드.

예시:

$a=5, 6, 7, 8, 9

Write-Output "Test collection:"
$a

Write-Output "`nMembers greater than 7"
$a -gt 7

Write-Output "`nMembers greater than or equal to 7"
$a -ge 7

Write-Output "`nMembers smaller than 7"
$a -lt 7

Write-Output "`nMembers smaller than or equal to 7"
$a -le 7
Test collection:
5
6
7
8
9

Members greater than 7
8
9

Members greater than or equal to 7
7
8
9

Members smaller than 7
5
6

Members smaller than or equal to 7
5
6
7

이러한 연산자는 System.IComparable을 구현하는 모든 클래스에서 작동합니다.

예:

# Date comparison
[DateTime]'2001-11-12' -lt [DateTime]'2020-08-01' # True

# Sorting order comparison
'a' -lt 'z'           # True; 'a' comes before 'z'
'macOS' -ilt 'MacOS'  # False
'MacOS' -ilt 'macOS'  # False
'macOS' -clt 'MacOS'  # True; 'm' comes before 'M'

다음 예제에서는 'a' 다음에 정렬되는 미국식 QWERTY 키보드에 기호가 없음을 보여 줍니다. 이러한 모든 기호가 포함된 집합을 연산자에 공급하여 -gt 'a'와 비교합니다. 출력은 빈 배열입니다.

$a=' ','`','~','!','@','#','$','%','^','&','*','(',')','_','+','-','=',
   '{','}','[',']',':',';','"','''','\','|','/','?','.','>',',','<'
$a -gt 'a'
# Output: Nothing

연산자의 양쪽이 합리적으로 비교할 수 없는 경우 이러한 연산자는 종료되지 않는 오류를 발생합니다.

일치 연산자

일치하는 연산자(-like, -notlike-match)는 지정된 패턴과 -notmatch일치하거나 일치하지 않는 요소를 찾습니다. 정규식(Regex)을 사용하고 수락하는 동안에 대한 -like-notlike 패턴은 -notmatch wild카드 식(포함, ?[ ])입니다.-match*

구문은 다음과 같습니다.

<string[]> -like    <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match    <regular-expression>
<string[]> -notmatch <regular-expression>

이러한 연산자의 입력이 스칼라 값이면 부울 값을 반환합니다.

입력이 값 컬렉션인 경우 컬렉션의 각 항목은 비교를 위해 문자열로 변환됩니다. 및 -notmatch 연산자는 -match 일치하는 멤버와 일치하지 않는 멤버를 각각 반환합니다. 그러나 및 -notlike 연산자는 -like 멤버를 문자열로 반환합니다. 컬렉션의 멤버에 -like 대해 반환된 문자열이며 -notlike 비교에 사용되는 연산자가 문자열로 멤버를 캐스팅하여 가져오는 문자열입니다.

-like 및 -notlike

-like-notlike 비슷하게 -eq 동작하지만 -ne오른쪽은 wild카드를 포함하는 문자열일 수 있습니다.

예시:

"PowerShell" -like    "*shell"           # Output: True
"PowerShell" -notlike "*shell"           # Output: False
"PowerShell" -like    "Power?hell"       # Output: True
"PowerShell" -notlike "Power?hell"       # Output: False
"PowerShell" -like    "Power[p-w]hell"   # Output: True
"PowerShell" -notlike "Power[p-w]hell"   # Output: False

"PowerShell", "Server" -like "*shell"    # Output: PowerShell
"PowerShell", "Server" -notlike "*shell" # Output: Server

-match 및 -notmatch

-match 정규 -notmatch 식을 사용하여 왼쪽 값의 패턴을 검색합니다. 정규식은 전자 메일 주소, UNC 경로 또는 서식이 지정된 전화 번호와 같은 복잡한 패턴과 일치할 수 있습니다. 오른쪽 문자열은 정규식 규칙을 준수해야 합니다.

스칼라 예제:

# Partial match test, showing how differently -match and -like behave
"PowerShell" -match 'shell'        # Output: True
"PowerShell" -like  'shell'        # Output: False

# Regex syntax test
"PowerShell" -match    '^Power\w+' # Output: True
'bag'        -notmatch 'b[iou]g'   # Output: True

입력이 컬렉션인 경우 연산자는 해당 컬렉션의 일치하는 멤버를 반환합니다.

컬렉션 예제:

"PowerShell", "Super PowerShell", "Power's hell" -match '^Power\w+'
# Output: PowerShell

"Rhell", "Chell", "Mel", "Smell", "Shell" -match "hell"
# Output: Rhell, Chell, Shell

"Bag", "Beg", "Big", "Bog", "Bug"  -match 'b[iou]g'
#Output: Big, Bog, Bug

"Bag", "Beg", "Big", "Bog", "Bug"  -notmatch 'b[iou]g'
#Output: Bag, Beg

-match-notmatch regex 캡처 그룹을 지원합니다. 스칼라 입력에서 실행되고 -match 결과가 True이거나 -notmatch결과가 False때마다 자동 변수를 $Matches 덮어씁 수 있습니다. $Matches는 항상 전체 일치 항목을 저장하는 '0'이라는 키가 있는 해시 테이블입니다. 정규식에 캡처 그룹이 포함된 경우 각 그룹에 $Matches 대한 추가 키가 포함됩니다.

해시 테이블은 일치하는 패턴의 첫 번째 항목만 포함한다는 점에 유 $Matches 의해야 합니다.

예시:

$string = 'The last logged on user was CONTOSO\jsmith'
$string -match 'was (?<domain>.+)\\(?<user>.+)'

$Matches

Write-Output "`nDomain name:"
$Matches.domain

Write-Output "`nUser name:"
$Matches.user
True

Name                           Value
----                           -----
domain                         CONTOSO
user                           jsmith
0                              was CONTOSO\jsmith

Domain name:
CONTOSO

User name:
jsmith

-match 결과가 False이거나 -notmatch결과가 True이거나 입력이 컬렉션인 경우 자동 변수를 $Matches 덮어쓰지 않습니다. 따라서 이전에 설정한 값이 $null 포함되거나 변수가 설정되지 않은 경우 해당 값이 포함됩니다. 이러한 연산자 중 하나를 호출한 후 참조할 $Matches 때 조건 문을 사용하여 변수가 현재 연산자 호출에 의해 설정되었는지 확인하는 것이 좋습니다.

예시:

if ("<version>1.0.0</version>" -match '<version>(.*?)</version>') {
    $Matches
}

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

대체 연산자

정규식으로 바꾸기

마찬가지로 -match연산자는 -replace 정규식을 사용하여 지정된 패턴을 찾습니다. 그러나 달리 -match일치 항목을 지정된 다른 값으로 바꿉니다.

구문:

<input> -replace <regular-expression>, <substitute>

연산자는 정규식을 사용하여 값의 전체 또는 일부를 지정된 값으로 바꿉니다. 파일 이름 바꾸기와 같은 많은 관리 작업에 연산자를 사용할 수 있습니다. 예를 들어 다음 명령은 모든 .txt 파일의 파일 이름 확장명을 다음과 같이 .log변경합니다.

Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }

기본적으로 연산자는 -replace 대/소문자를 구분하지 않습니다. 대/소문자를 구분하려면 .를 사용합니다 -creplace. 명시적으로 대/소문자를 -ireplace구분하지 않도록 하려면 .

예:

"book" -ireplace "B", "C" # Case insensitive
"book" -creplace "B", "C" # Case-sensitive; hence, nothing to replace
Cook
book

PowerShell 7.2부터 연산자 문의 왼쪽 피연산자가 -replace 문자열이 아닌 경우 해당 피연산자가 문자열로 변환됩니다. PowerShell은 문화권을 구분하지 않는 문자열 변환을 수행합니다.

예를 들어 문화권이 프랑스어(fr)로 설정된 경우 값 1.2 의 문화권 구분 문자열 변환은 다음과 같습니다 1,2.

PowerShell 7.2 이전:

PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
12

PowerShell 7.2 이상에서:

PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
1.2

정규식 대체

정규식을 사용하여 캡처링 그룹 및 대체를 사용하여 텍스트를 동적으로 바꿀 수도 있습니다. 캡처 그룹은 그룹 식별자 앞에 달러 기호($) 문자를 사용하여 문자열에서 참조 <substitute> 할 수 있습니다.

다음 예제 -replace 에서 연산자는 사용자 이름을 형식 DomainName\Username 으로 수락하고 형식으로 Username@DomainName 변환합니다.

$SearchExp = '^(?<DomainName>[\w-.]+)\\(?<Username>[\w-.]+)$'
$ReplaceExp = '${Username}@${DomainName}'

'Contoso.local\John.Doe' -replace $SearchExp, $ReplaceExp
John.Doe@Contoso.local

Warning

이 문자는 $ PowerShell 및 정규식 모두에서 구문 역할을 합니다.

  • PowerShell에서는 큰따옴표 사이에 변수를 지정하고 하위 식 연산자 역할을 합니다.
  • Regex 검색 문자열에서는 줄의 끝을 표시합니다.
  • Regex 대체 문자열에서는 캡처된 그룹을 나선다. 정규식을 작은따옴표 사이에 두거나 앞에 백틱(`) 문자를 삽입해야 합니다.

예시:

$1 = 'Goodbye'

'Hello World' -replace '(\w+) \w+', "$1 Universe"
# Output: Goodbye Universe

'Hello World' -replace '(\w+) \w+', '$1 Universe'
# Output: Hello Universe

$$ 의 Regex는 리터럴 $을 지정합니다. 결과 $$ 대체에 리터럴 $ 을 포함하도록 대체 문자열에 포함됩니다. 예시:

'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1'  # Output: $1

자세한 내용은 정규식의 about_Regular_Expressions대체를 참조하세요.

컬렉션에서 대체

연산자가 <input>-replace 컬렉션인 경우 PowerShell은 컬렉션의 모든 값에 대체를 적용합니다. 예시:

"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5

스크립트 블록으로 대체

PowerShell 6 이상에서 연산자는 -replace 대체를 수행하는 스크립트 블록도 허용합니다. 스크립트 블록은 매 경기마다 한 번씩 실행됩니다.

구문:

<String> -replace <regular-expression>, {<Script-block>}

스크립트 블록 내에서 자동 변수를 $_ 사용하여 대체되는 입력 텍스트 및 기타 유용한 정보에 액세스합니다. 이 변수의 클래스 형식은 System.Text.RegularExpressions.Match입니다.

다음 예제에서는 세 자리 숫자의 각 시퀀스를 해당하는 문자로 바꿉니다. 스크립트 블록은 교체해야 하는 세 자리의 각 집합에 대해 실행됩니다.

"072101108108111" -replace "\d{3}", {return [char][int]$_.Value}
Hello

포함 연산자

포함 연산자(-contains, -notcontains, -in-notin)는 입력이 컬렉션인 경우에도 항상 부울 값을 반환한다는 점을 제외하고 같음 연산자와 유사합니다. 이러한 연산자는 첫 번째 일치 항목을 검색하는 즉시 비교를 중지하는 반면 같음 연산자는 모든 입력 멤버를 평가합니다. 매우 큰 컬렉션에서 이러한 연산자는 같음 연산자보다 더 빨리 반환됩니다.

-contains 및 -notcontains

구문:

<Collection> -contains <scalar-object>
<Collection> -notcontains <scalar-object>

이러한 연산자는 집합에 특정 요소가 포함되어 있는지 여부를 나타냅니다. -contains오른쪽(스칼라 개체)이 집합의 요소 중 하나와 일치하면 True를 반환합니다. -notcontains 는 대신 False를 반환합니다.

예:

"abc", "def" -contains "def"                  # Output: True
"abc", "def" -notcontains "def"               # Output: False
"Windows", "PowerShell" -contains "Shell"     # Output: False
"Windows", "PowerShell" -notcontains "Shell"  # Output: True
"abc", "def", "ghi" -contains "abc", "def"    # Output: False
"abc", "def", "ghi" -notcontains "abc", "def" # Output: True

더 복잡한 예제:

$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
                 "ContosoDHCP","ContosoWSUS"
$thisComputer  = "ContosoDC2"

$DomainServers -contains $thisComputer
# Output: True

오른쪽 피연산자가 컬렉션인 경우 이러한 연산자는 값을 왼쪽 컬렉션과 비교하기 전에 해당 문자열 표현으로 변환합니다.

$a = "abc", "def"
"abc", "def", "ghi" -contains $a # Output: False

# The following statements are equivalent
$a, "ghi" -contains $a           # Output: True
"$a", "ghi" -contains $a         # Output: True
"abc def", "ghi" -contains $a    # Output: True

-in 및 -notin

구문:

<scalar-object> -in <Collection>
<scalar-object> -notin <Collection>

-in-notin 연산자는 PowerShell 3에서 연산자의 구문 반대로 -contains-notcontains 도입되었습니다. -in는 왼쪽 <scalar-object> 이 컬렉션의 요소 중 하나와 일치하면 True를 반환합니다. -notin는 대신 False를 반환합니다.

다음 예제에서는 예제 -contains-notcontains 동일한 작업을 수행하지만 대신 작성 -in-notin 됩니다.

"def" -in "abc", "def"                  # Output: True
"def" -notin "abc", "def"               # Output: False
"Shell" -in "Windows", "PowerShell"     # Output: False
"Shell" -notin "Windows", "PowerShell"  # Output: True
"abc", "def" -in "abc", "def", "ghi"    # Output: False
"abc", "def" -notin "abc", "def", "ghi" # Output: True

더 복잡한 예제:

$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
                 "ContosoDHCP","ContosoWSUS"
$thisComputer  = "ContosoDC2"

$thisComputer -in $DomainServers
# Output: True

왼쪽 피연산자가 컬렉션인 경우 이러한 연산자는 값을 오른쪽 컬렉션과 비교하기 전에 해당 문자열 표현으로 변환합니다.

$a = "abc", "def"
$a -in "abc", "def", "ghi" # Output: False

# The following statements are equivalent
$a -in $a, "ghi"           # Output: True
$a -in "$a", "ghi"         # Output: True
$a -in "abc def", "ghi"    # Output: True

형식 비교

형식 비교 연산자(-is-isnot)는 개체가 특정 형식인지 확인하는 데 사용됩니다.

구문:

<object> -is <type-reference>
<object> -isnot <type-reference>

예시:

$a = 1
$b = "1"
$a -is [int]           # Output: True
$a -is $b.GetType()    # Output: False
$b -isnot [int]        # Output: True
$a -isnot $b.GetType() # Output: True

참고 항목