about_Comparison_Operators
簡単な説明
PowerShell の比較演算子は、2 つの値を比較するか、コレクションの要素を入力値とフィルター処理できます。
詳細な説明
比較演算子を使用すると、指定したパターンに一致する値を比較したり、値を検索したりできます。 PowerShell には、次の比較演算子が含まれています。
等式
-eq
、-ieq
、-ceq
- 等しい-ne
、-ine
、-cne
- 等しくない-gt
、-igt
、-cgt
- より大きい-ge
、-ige
、-cge
- 以上-lt
、-ilt
、-clt
- より小さい-le
、-ile
、-cle
- 以下
[照合]
-like
、-ilike
、-clike
- 文字列がワイルドカード パターンに一致する-notlike
、-inotlike
、-cnotlike
- 文字列がワイルドカード パターンと一致しません-match
、-imatch
、-cmatch
- 文字列が正規表現パターンに一致する-notmatch
、-inotmatch
、-cnotmatch
- 文字列が正規表現パターンと一致しない
代替
-replace
、-ireplace
、-creplace
- 正規表現パターンに一致する文字列を置き換えます
封じ込め
-contains
、-icontains
、-ccontains
- コレクションに値が含まれています-notcontains
、-inotcontains
、-cnotcontains
- コレクションに値が含まれていない-in
- 値がコレクション内にある-notin
- 値がコレクション内にない
Type
-is
- 両方のオブジェクトが同じ型です-isnot
- オブジェクトが同じ型ではありません
共通機能
明示的な大文字と小文字を区別する演算子を使用しない限り、文字列比較では大文字と小文字が区別されません。 比較演算子で大文字と小文字を区別するには、-
の後にc
を追加します。 たとえば、 -ceq
は大文字と小文字が区別されるバージョンの -eq
です。
大文字と小文字の区別を明示的にするには、-
の後にi
を追加します。 たとえば、 -ieq
は明示的に大文字と小文字を区別しないバージョンの -eq
です。
文字列比較では、大文字と小文字を区別する比較と大文字と小文字を区別しない比較の両方に InvariantCulture を使用します。 比較は Unicode コード ポイント間で行われ、カルチャ固有の照合順序の順序は使用されません。 結果は、現在のカルチャに関係なく同じです。
比較式の左側の値が scalar 値の場合、演算子は Boolean 値を返します。 式の左側の値がコレクションの場合、演算子は、式の右側の値に一致するコレクションの要素を返します。 右側の値は、コレクションの場合でも、常にシングルトン インスタンスとして扱われます。 比較演算子は、コレクションとコレクションを効果的に比較することはできません。
コレクションに一致がない場合、比較演算子は空の配列を返します。 次に例を示します。
$a = (1, 2) -eq 3
$a.GetType().Name
$a.Count
Object[]
0
次のようにいくつかの例外があります。
- コンテインメント演算子と型演算子は常に Boolean 値を返します
-replace
演算子は置換結果を返します-match
演算子と-notmatch
演算子は、式の左側がコレクションでない限り、$Matches
自動変数にも設定します。
等値演算子
-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
等値演算子は、スカラーまたはコレクションだけでなく、任意の 2 つのオブジェクトを受け入れます。 ただし、比較結果がエンドユーザーにとって意味があるとは限りません。 次の例は、この問題を示しています。
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
この例では、同じプロパティを持つ 2 つのオブジェクトを作成しました。 ただし、等値テストの結果は異なるオブジェクトであるためFalse です。 同等のクラスを作成するには、クラスに System.IEquatable<T> を実装する必要があります。 次の例では、System.IEquatable<T> を実装し、File と Size の 2 つのプロパティを持つMyFileInfoSet クラスの部分的な実装を示します。 2 つのMyFileInfoSet オブジェクトの File プロパティと Size プロパティが同じ場合、Equals()
メソッドは 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
を配置する必要があります。 右側に配置しても、期待した操作は行われません。
たとえば、 $a
null 要素を含む配列にします。
$a = 1, 2, $null, 4, $null, 6
次のテストでは、 $a
が null ではありません。
$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
の動作は非常に似ています。 両側がスカラーの場合、2 つの辺の比較方法に応じてTrueまたはFalse が返されます。
Operator | 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
Note
ほとんどのプログラミング言語では、より大きい演算子が >
。 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
) は、指定されたパターンに一致する要素または一致しない要素を検索します。 -like
と-notlike
のパターンはワイルドカード式 (*
、?
、および[ ]
を含む) であり、正規表現 (Regex) を受け取-match
-notmatch
。
構文は次のとおりです。
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
これらの演算子の入力がスカラー値の場合は、 Boolean 値が返されます。
入力が値のコレクションである場合、コレクション内の各項目は比較のために文字列に変換されます。 -match
演算子と-notmatch
演算子は、一致するメンバーと一致しないメンバーをそれぞれ返します。 ただし、 -like
演算子と -notlike
演算子は、メンバーを文字列として返します。 -like
および-notlike
によってコレクションのメンバーに返される文字列は、比較に使用される演算子の文字列であり、メンバーを文字列にキャストすることによって取得されます。
-like と -notlike
-like
-notlike
は-eq
や-ne
と同様に動作しますが、右側にはワイルドカードを含む文字列。
例:
"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
。 スカラー入力で実行され、 -match
の結果が True、または -notmatch
の結果が False されるたびに、 $Matches
自動変数が上書きされます。 $Matches
は常に '0' という名前のキーを持つ Hashtable であり、一致全体を格納します。
正規表現にキャプチャ グループが含まれている場合、 $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_Expressions と about_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
警告
$
文字には、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
$$
in Regex はリテラル $
を表します。 この $$
置換文字列に、結果の置換にリテラル $
を含めます。 次に例を示します。
'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1' # Output: $1
詳細については、「正規表現の about_Regular_Expressions と Substitutions」を参照してください。
コレクション内での置換
-replace
演算子への<input>
がコレクションである場合、PowerShell はコレクション内のすべての値に置換を適用します。 次に例を示します。
"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5
スクリプト ブロックでの置換
PowerShell 6 以降では、 -replace
演算子は置換を実行するスクリプト ブロックも受け入れます。 スクリプト ブロックは、一致するたびに 1 回実行されます。
構文:
<String> -replace <regular-expression>, {<Script-block>}
スクリプト ブロック内で、 $_
自動変数を使用して、置き換えられる入力テキストやその他の有用な情報にアクセスします。 この変数のクラス型は System.Text.RegularExpressions.Match です。
次の例では、3 桁の各シーケンスを等価の文字に置き換えます。 スクリプト ブロックは、置き換える必要がある 3 桁のセットごとに実行されます。
"072101108108111" -replace "\d{3}", {return [char][int]$_.Value}
Hello
包含演算子
包含演算子 (-contains
、 -notcontains
、 -in
、および -notin
) は等値演算子に似ていますが、入力がコレクションの場合でも常に Boolean 値を返す点が異なります。 これらの演算子は最初の一致を検出するとすぐに比較を停止しますが、等値演算子はすべての入力メンバーを評価します。 非常に大きなコレクションでは、これらの演算子は等値演算子よりも高速に返されます。
-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
演算子は、-contains
演算子と-notcontains
演算子の構文の逆として PowerShell 3 で導入されました。 -in
は True 左側の <scalar-object>
がコレクション内のいずれかの要素と一致する場合に返します。 -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
関連項目
PowerShell