about_Switch

簡単な説明

スイッチを使用して複数 if のステートメントを処理する方法について説明します。

長い説明

スクリプトまたは関数の条件を確認するには、ステートメントを if 使用します。 このステートメントでは if 、変数の値やオブジェクトのプロパティなど、さまざまな種類の条件を確認できます。

複数の条件を確認するには、ステートメントを switch 使用します。 ステートメントは switch 一連の if ステートメントと同等ですが、より簡単です。 ステートメントには switch 、各条件とオプションのアクションが一覧表示されます。 条件が取得されると、アクションが実行されます。

ステートメントではswitch、変数と$switch自動変数を$_使用できます。 詳細については、「about_Automatic_Variables」を参照してください。

構文

基本 switch ステートメントの形式は次のとおりです。

Switch (<test-expression>)
{
    <result1-to-be-matched> {<action>}
    <result2-to-be-matched> {<action>}
}

同等 if のステートメントは次のとおりです。

if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}

<test-expression> を返すために式モードで評価される 1 つの式です。

これは <result-to-be-matched> 、値が入力値と比較される式です。 式には、ブール値を返すリテラル値 (文字列または数値)、変数、スクリプトブロックが含まれます。

数値として認識されない引用符で囲まれていない値は、文字列として扱われます。 混乱や意図しない文字列変換を回避するには、常に文字列値を引用符で囲む必要があります。 式が正しく評価されるように、すべての式をかっこで囲 ()み、部分式を作成します。

値が比較式の <result-to-be-matched> 左側にあることを理解しておくことが重要です。 つまり、右側の <test-expression> 結果は、比較のために左側の値の型に変換できます。 詳細については、about_Comparison_Operatorsを参照してください。

default値は、他の一致がない場合に使用されるアクション用に予約されます。

$_自動変数には、ステートメントに渡されるswitch式の値が含まれており、ステートメントの<result-to-be-matched>スコープ内で評価および使用できます。

完全な switch ステートメント構文は次のとおりです。

switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> } # optional
}

または

switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> }  # optional
}

パラメーターが使用されていない場合は、 switchExact パラメーターの使用と同じように動作します。 値に対して大文字と小文字を区別しない一致が実行されます。 値がコレクションの場合、各要素は表示される順序で評価されます。

ステートメントには switch 、少なくとも 1 つの条件ステートメントを含める必要があります。

この default 句は、値が条件のいずれにも一致しない場合にトリガーされます。 これは、ステートメント内の else 句と if 同等です。 各switchステートメントで許可される句は 1 つだけdefaultです。

switch には、次のパラメーターがあります。

  • ワイルドカード - 条件がワイルドカード文字列であることを示します。 match 句が文字列でない場合、パラメーターは無視されます。 比較では大文字と小文字は区別されません。
  • Exact - match 句が文字列の場合は、正確に一致する必要があることを示します。 match 句が文字列でない場合、このパラメーターは無視されます。 比較では大文字と小文字は区別されません。
  • CaseSensitive - 大文字と小文字が区別される一致を実行します。 match 句が文字列でない場合、このパラメーターは無視されます。
  • File- ファイルではなくファイルから入力を <test-expression>受け取ります。 複数の File パラメーターが含まれている場合は、最後のパラメーターのみが使用されます。 ファイルの各行は、ステートメントによって switch 読み取られ、評価されます。 比較では大文字と小文字は区別されません。
  • Regex - 値と条件の正規表現の照合を実行します。 match 句が文字列でない場合、このパラメーターは無視されます。 比較では大文字と小文字は区別されません。 $matches自動変数は、一致するステートメント ブロック内で使用できます。

注意

Regexワイルドカードなどの競合する値を指定する場合、指定された最後のパラメーターが優先され、競合するすべてのパラメーターは無視されます。 パラメーターの複数のインスタンスも許可されます。 ただし、最後に一覧表示されたパラメーターのみが使用されます。

次の例では、このステートメントは switch テスト値 3 を各条件と比較します。 テスト値が条件と一致すると、アクションが実行されます。

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
It is three.

この単純な例では、値 3 に一致するものがある場合でも、値はリスト内の各条件と比較されます。 次 switch のステートメントには、値 3 の 2 つの条件があります。 既定では、すべての条件がテストされていることを示します。

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.
Three again.

一致後に switch 比較を停止するように指示するには、ステートメントを break 使用します。 ステートメントは break ステートメントを switch 終了します。

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."; Break}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.

テスト値が配列などのコレクションの場合は、コレクション内の各項目が表示される順序で評価されます。 次の例では、4 と 2 を評価します。

switch (4, 2)
{
    1 {"It is one." }
    2 {"It is two." }
    3 {"It is three." }
    4 {"It is four." }
    3 {"Three again."}
}
It is four.
It is two.

次の例に示すように、各値ではなく、すべての break ステートメントがコレクションに適用されます。 ステートメントは switch 、値 4 の条件のステートメントによって break 終了します。

switch (4, 2)
{
    1 {"It is one."; Break}
    2 {"It is two." ; Break }
    3 {"It is three." ; Break }
    4 {"It is four." ; Break }
    3 {"Three again."}
}
It is four.

この例では、文字列または数値データではないオブジェクトが .switch オブジェクト switch に対して文字列強制を実行し、結果を評価します。

$test = @{
    Test  = 'test'
    Test2 = 'test2'
}

$test.ToString()

switch -Exact ($test)
{
    'System.Collections.Hashtable'
    {
        'Hashtable string coercion'
    }
    'test'
    {
        'Hashtable value'
    }
}
System.Collections.Hashtable
Hashtable string coercion

この例では、一致するケースがないため、出力はありません。

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
}

句を追加することで、他の default 条件が成功しなかった場合にアクションを実行できます。

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
    Default {
        "No matches"
    }
}
No matches

単語 "14" がケースと一致するには、or -Regex パラメーターを使用する-Wildcard必要があります。

   PS> switch -Wildcard ("fourteen")
       {
           1 {"It is one."; Break}
           2 {"It is two."; Break}
           3 {"It is three."; Break}
           4 {"It is four."; Break}
           "fo*" {"That's too many."}
       }
That's too many.

次の例では、パラメーターを -Regex 使用します。

$target = 'https://bing.com'
switch -Regex ($target)
{
    '^ftp\://.*$' { "$_ is an ftp address"; Break }
    '^\w+@\w+\.com|edu|org$' { "$_ is an email address"; Break }
    '^(http[s]?)\://.*$' { "$_ is a web address that uses $($matches[1])"; Break }
}
https://bing.com is a web address that uses https

次の例では、スクリプト ブロックをステートメント条件として switch 使用する方法を示します。

switch ("Test")
{
    {$_ -is [String]} {
        "Found a string"
    }
    "Test" {
        "This $_ executes as well"
    }
}
Found a string
This Test executes as well

次の例では、2 つの日付値を含む配列を処理します。 各 <value-scriptblock> 日付の Year プロパティを比較します。 <action-scriptblock> 2022 年の初めまでのウェルカム メッセージまたは日数が表示されます。

switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
    { $_.Year -eq 2021 } {
        $days = ((Get-Date 1/1/2022) - $_).days
        "There are $days days until 2022."
    }
    { $_.Year -eq 2022 } { 'Welcome to 2022!' }
}

値が複数の条件に一致する場合は、各条件のアクションが実行されます。 この動作を変更するには、またはcontinueキーワードをbreak使用します。

キーワードは break 処理を停止し、ステートメントを switch 終了します。

キーワードは continue 現在の値の処理を停止しますが、後続の値の処理を続行します。

次の例では、数値の配列を処理し、奇数または偶数の場合に表示します。 負の数値はキーワードで continue スキップされます。 数値以外の値が見つかった場合、実行はキーワードで break 終了します。

switch (1,4,-1,3,"Hello",2,1)
{
    {$_ -lt 0} { continue }
    {$_ -isnot [Int32]} { break }
    {$_ % 2} {
        "$_ is Odd"
    }
    {-not ($_ % 2)} {
        "$_ is Even"
    }
}
1 is Odd
4 is Even
3 is Odd

こちらもご覧ください