Nick 7/9 评论后的新内容:

Nick 7/9 评论后的新内容:

我正在尝试使用 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") {

相关内容