假设我有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
语句都不起作用。我不知道自己错过了什么,但我确定这是一个我忽视的简单错误。任何人都可以帮助我发现这个错误吗?
答案 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"}
}
小附录:停止使用全局变量!