使用全局数组切换处理

时间:2018-03-08 22:47:35

标签: powershell switch-statement

假设我有2个全局数组:

$Global:Values  = @(1..100)
$Global:Test = @(75, 50, 25, 101)

然后我通过使用不同的条件将Switch通过管道$Global:Test创建ForEach,我尝试进行故障排除以获得任何响应:

$Global:Test | ForEach-Object ($_) {
    $_
    Switch ($_) {
        ($_ -contains $Global:Values) {Write-Host "Excellent"}
        ($_ -in $Global:Values) {Write-Host "Satisfactory"}
        ($_ -eq "25") {Write-Host "Unsatisfactory"}
        Default {Write-Host "Invalid Grade"}
    }
}

输出:

75
Invalid Grade
50
Invalid Grade
25
Invalid Grade
101
Invalid Grade

除了switch之外,所有这些default语句都不起作用。我不知道自己错过了什么,但我确定这是一个我忽视的简单错误。任何人都可以帮助我发现这个错误吗?

1 个答案:

答案 0 :(得分:3)

foreach()语句与ForEach-Object cmdlet不同,您似乎正在结合两者的语法。

此外,您错误地使用了switch语句。

您尝试匹配的部分需要是一个值:

switch ($something)
{
    5 { "5 thing" }
    (10 + 10) { "20 thing" }
}

或返回truthy或falsey值的scriptblock表达式:

switch ($something)
{
    { $_ -gt 5 } { "do > 5 thing" }
    { Test-SomeCondition -Value $_ } { "do other thing" }
}

所以你想要scriptblock表单,但是你正在使用括号。

所以这是ForEach-Object形式:

$Global:Test | ForEach-Object {
    Switch ($_) {
        {$_ -contains $Global:Values} {Write-Host "Excellent"}
        {$_ -in $Global:Values} {Write-Host "Satisfactory"}
        "25" {Write-Host "Unsatisfactory"}
        Default {Write-Host "Invalid Grade"}
    }
}

foreach表格:

foreach($value in $Global:Test) {
    Switch ($value) {
        {$_ -contains $Global:Values} {Write-Host "Excellent"}
        {$_ -in $Global:Values} {Write-Host "Satisfactory"}
        "25" {Write-Host "Unsatisfactory"}
        Default {Write-Host "Invalid Grade"}
    }
}

另外值得注意的是,switch语句实际上可以直接使用数组,因此您不必先进行迭代。基本示例:

switch (1..10)
{
    { $_ -gt 5 } { "Second Half"}
    default: { "First Half" }
}

所以和你的一样,也许:

Switch ($Global:Test) {
    {$_ -contains $Global:Values} {Write-Host "Excellent"}
    {$_ -in $Global:Values} {Write-Host "Satisfactory"}
    "25" {Write-Host "Unsatisfactory"}
    Default {Write-Host "Invalid Grade"}
}

小附录:停止使用全局变量!