web-dev-qa-db-ja.com

switchステートメントの複数の値に対するPowerShell構文は何ですか?

私は基本的にこれをやりたい:

switch($someString.ToLower())
{
    "y", "yes" { "You entered Yes." }
    default { "You entered No." }
}
65
Micah
switch($someString.ToLower()) 
{ 
    {($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." } 
    default { "You entered No." } 
}
77
fletcher

私はこれが機能し、より読みやすいように見えました:

switch($someString)
{
    { @("y", "yes") -contains $_ } { "You entered Yes." }
    default { "You entered No." }
}

「-contains」演算子は、大文字と小文字を区別しない検索を実行するため、「ToLower()」を使用する必要はありません。大文字と小文字を区別する場合は、代わりに「-ccontains」を使用できます。

43
Jimmy

値にワイルドカードを使用できるはずです。

switch -wildcard ($someString.ToLower())
{
    "y*" { "You entered Yes." }
    default { "You entered No." }
}

正規表現も使用できます。

switch -regex ($someString.ToLower())
{
    "y(es)?" { "You entered Yes." }
    default { "You entered No." }
}

PowerShellスイッチのドキュメント:Switchステートメントの使用

42
derekerdmann
switch($someString.ToLower())
{
    "yes"   { $_ = "y" }
    "y"     { "You entered Yes." }
    default { "You entered No." }
}

ターゲットケースが存在する限り、この方法でケースを任意に分岐、カスケード、およびマージできますbelow/after $ _変数がそれぞれ再割り当てされるケース。


n.b.この動作はとてもかわいいですが、PowerShellインタープリターがスイッチ/ケースを実装しているのは、期待または想定するほど効率的ではないようです。たとえば、ISEデバッガーを使用したステッピングでは、最適化されたルックアップ、ハッシュ、またはバイナリ分岐の代わりに、多くのif-elseステートメントのように、各ケースが順番にテストされることを示唆しています。 (もしそうなら、最も一般的なケースを最初に置くことを検討してください。)また、この回答に示すように、PowerShellはケースを満たした後もケースのテストを続けます。そして残酷なことに、.NET CILで利用可能な特別な最適化された「スイッチ」オペコードもありますが、この動作のため、PowerShellは利用できません。

6
Glenn Slayden

Y | ye | yesの入力をサポートし、大文字と小文字を区別しません。

switch -regex ($someString.ToLower()) {
        "^y(es?)?$" {
            "You entered Yes." 
        }
        default { "You entered No." }
}
5
Doug Finke

正規表現の代替演算子「|」(パイプ)を使用して、元の要求を満たすためにderekerdmannの投稿にわずかな変更を加えました。

また、正規表現の初心者が理解して読むのも少し簡単です。

正規表現を使用しているときに、文字列文字の先頭「^」(キャレット/サーカムフレックス)および/または文字列文字の末尾「$」(ドル)を入力しないと、予期しない/直感的でない動作(「昨日」または「理由」)。

オプションをグループ化文字「()」(括弧)で囲むと、各オプションの文字列の開始文字と終了文字を配置する必要が少なくなります。それらがないと、正規表現に精通していない場合、予期しない動作が発生する可能性があります。もちろん、ユーザー入力を処理するのではなく、既知の文字列のセットを処理する場合は、グループ化および文字列の開始と終了文字なしで読みやすくなります。

switch -regex ($someString) #many have noted ToLower() here is redundant
{
        #processing user input
    "^(y|yes|indubitably)$" { "You entered Yes." }

        # not processing user input
    "y|yes|indubitably" { "Yes was the selected string" } 
    default { "You entered No." } 
}
4
Takophiliac