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。 case-insensitivity を明示的にするには、after -を追加しますi。 たとえば、 -ieq 明示的に大文字と小文字を区別しないバージョンです -eq

演算子の入力がスカラー値の場合、演算子は ブール 値を返します。 入力がコレクションの場合、演算子は、式の右側の値に一致するコレクションの要素を返します。 コレクションに一致がない場合、比較演算子は空の配列を返します。 次に例を示します。

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

次のようにいくつかの例外があります。

  • 包含演算子と型演算子は常に ブール 値を返します
  • 演算子は -replace 置換結果を返します
  • -matchまた、式の-notmatch左側が$Matchesコレクションでない限り、および演算子によって自動変数も設定されます。

等値演算子

-eq と -ne

左側がスカラーの場合、 -eq 右側が完全に一致する場合は True を 返し、それ以外の場合 -eqFalse を返します-ne反対を行います。両側が一致する場合は False を返します。それ以外の場合は True-ne を返します。

例:

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 する必要があります。 右側に配置しても、期待どおりの処理は行われません。

たとえば、null 要素を含む配列を指定します $a

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

null ではない次の $a テスト。

$null -ne $a
True

ただし、次のファイラーは、次からすべての null 要素を $a出力します。

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

-gt、-ge、-lt、-le

-gt-ge-ltおよび非常によく似た動作をします -le 。 両側がスカラーの場合、2 つの辺の比較方法に応じて True または False が 返されます。

演算子 True when... を返します。
-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、、、-matchおよび) は、-notlike指定されたパターンに-notmatch一致する要素または一致しない要素を検索します。 のパターン-like-notlikeは、ワイルドカード式 (〘、?および[ ]を含む*) で、-match-notmatch正規表現 (Regex) を受け入れます。

の構文は次のとおりです。

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

これらの演算子の入力がスカラー値の場合は、 ブール 値を返します。 入力が値のコレクションである場合、演算子は一致するすべてのメンバーを返します。 コレクションに一致する値がない場合、演算子は空の配列を返します。

-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

結果が -matchFalse の場合、または -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

正規表現の置換

また、正規表現を使用して、キャプチャ グループや置換を使用してテキストを動的に置き換えることもできます。 キャプチャ グループは、グループ識別子の <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置換」を参照してください。

コレクションの置換

演算子が<input>-replaceコレクションの場合、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

Containment 演算子

包含演算子 (-contains-notcontains-in) は等値演算子に-notin似ていますが、入力がコレクションの場合でも常にブール値を返す点が異なります。 これらの演算子は、最初の一致を検出するとすぐに比較を停止しますが、等値演算子はすべての入力メンバーを評価します。 非常に大きなコレクションでは、これらの演算子は等値演算子よりも速く返されます。

構文:

<Collection> -contains <Test-object>
<Collection> -notcontains <Test-object>
<Test-object> -in <Collection>
<Test-object> -notin <Collection>

-contains と -notcontains

これらの演算子は、セットに特定の要素が含まれているかどうかを示します。 -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
$a, "ghi" -contains $a           # Output: True

-in と -notin

PowerShell -in 3 では、演算子と-notin演算子の構文の逆として、演算子と-notcontains演算子が-contains導入されました。 -in左側<test-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
$a -in $a, "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

関連項目