我正在尝试使用 switch 命令从数组中选择某些内容。数组的大小可以根据另一个电子表格中的信息而改变。
例如:
C:\> $Test = A
C:\> $ListA
Item_One Item_Two
-------- --------
A 1
B 2
C 3
我想创建一个 switch,它将在检查Item_Two
时返回相应的值。我遇到的问题是,可以根据情况更改值的数量。我考虑的 switch 语句是这样的:$Test
$ListA.Item_One
$ListA
switch ($Test)
{
$ListA.Item_One {write-host $ListA.Item_two}
default {"Not found"}
}
当我运行此代码时,它只是默认设置,我无法让它触发该$ListA.Item_One
部分。有没有办法做到这一点,或者我还能如何做我想做的事情?我知道我可以使用 for-each 循环,但我想看看是否还有其他方法。我可以想象,如果列表太大,筛选起来会花很长时间。目前列表只有 5-10 个项目,但一年内可能会增长到 40 多个。
编辑:我正在通过 .csv 填充列表:
$listA = Import C:\File.csv
答案1
根据您所做的操作,$listA 没有名为“Item_One”的元素,因此表达式实际上为 NULL
它是一个数组,如果您想从 $listA 中获取“A”,则需要使用 $listA[0].Item_One 和 $ListA[0].Item_two
如果不了解有关这种情况的更多信息,则不太确定该建议什么...
您真的有这么多项目需要 CSV 吗?
如果没有,请尝试使用哈希表
PS C:\temp> $listA = import-csv .\list.csv
PS C:\temp> $listA
Item_One Item_Two
-------- --------
A 1
B 2
C 3
PS C:\temp> $listA.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\temp> $listA.Item_One
PS C:\temp> $listA[0].Item_One
A
PS C:\temp> switch ($Test)
>> {
>> $listA[0].Item_One {write-host $ListA[0].Item_two}
>> default {"Not found"}
>> }
>>
1
# Hash table example
$hash=@{"A"=1;"B"=2;"C"=3}
$hash.A
1
Nick 7/9 评论后的新内容:
我认为 case/switch 结构不太适合这种情况。这似乎可以满足您的需要。
$listA | foreach {
if ($_.item_one -eq "A") {
# do something
write-host $_.item_two
} elseif ($_.item_one -eq "B") {
# do something different
write-host $_.item_two
} else {
$found = $false
}
}
if ($found -eq $false) {
write-host "default"
}
根据您的需要,IF 子句也可以像这样开始
if ($_.item_one -match "A|B|C") {