2

ケースごとに複数の値を持つスイッチケースを作成できるかどうか疑問に思っています。私はさまざまな方法でユーザー入力を取り入れようとしています。メニューは次のようになります。

    $database = Read-Host "[1] db 1 [2] db2 [3] db3 [4] ALL dbs"

次に、これは、次の読み取りホストでのユーザーの応答に基づいて、パラメーターとして4つの異なる関数に渡されます。ばかげた数のケースを作ることなく、私はすべての可能な入力を受け入れることができるようにしたいと思います。つまり、ユーザーが2つのデータベースを表示したい場合は、32または23を入力できます。すべてを表示したい場合は、4、321、123、213を受け入れます...現在、私はこれを次の方法で実現しようとしています。

switch ($database) { 
(4 -or 123 -or 312 -or ...) {#return all paths}
(12 -or 21) { #return 1st 2 db paths}
(31 -or 13) { #return 1st and last db paths}
(1) {#return 1st db path}
...
}

これにより構文エラーが発生するため、明らかに機能しません。お分かりのように、すでに多くのケースがあります(7)。すべてのオプションをリストアップする必要がある場合、2倍以上になります(16)。スイッチケースで1対多の関連付けを作成する方法はありますか?そうでない場合、誰かが私がこの問題に取ることができる新しいアプローチのアイデアを持っていますか?

解決

    switch -regex ($database)
            {
                "[*1*]" {"\\db1"}
                "[*2*]" {"\\db2"}
                "[*3*]" {"\\db3"} 
                "[4]" {"\\db1";"\\db2";"\\db3"}
                default {Write-Host "Database(s) were not properly specified,
 Please run the script again"
exit}
            }

これは私が目指していたものを達成します-orが、switchステートメントに条件を入れる方法を理解することはできませんでしたが、それが可能であるとは思いません

4

3 に答える 3

1

そのまま使えますstring.Containsか?

$result = ""
if ($database.Contains("1") -or $database -eq "4") {
    $result += "db path 1";
}
if ($database.Contains("2") -or $database -eq "4") {
    $result += "db path 2";
}
if ($database.Contains("3") -or $database -eq "4") {
    $result += "db path 3";
}
if ($result = "") {
    #Error condition?
}
return $result
于 2012-07-27T21:03:06.437 に答える
0
$database = Read-Host "[1] db 1 [2] db2 [3] db3 [4] ALL dbs"

if($database -like "*4*")
{
    "return all paths"
}
else
{
    [char[]]$database | Select-Object -Unique | Foreach-Object { "return db $_ path" }  
}
于 2012-07-27T22:12:13.117 に答える
-1

私はあなたが取り組むことができると思います

switch -regex ($database)

-ここを見てください

于 2012-07-27T19:45:56.030 に答える