2

我想知道是否可以创建每个案例超过 1 个值的开关案例。我试图以不同的方式接受用户输入。菜单看起来像:

    $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)。如果我必须列出每一个选项,那将是两倍以上(16)。有没有办法在开关盒中创建一对多关联?如果没有,有没有人知道我可以采取的新方法来解决这个问题?

解决方案

    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 回答