Я пытаюсь использовать команду переключателя, чтобы выбрать что-то из массива. Размер массива может меняться в зависимости от информации из другой электронной таблицы.
Например:
C:\> $Test = A
C:\> $ListA
Item_One Item_Two
-------- --------
A 1
B 2
C 3
Я хочу создать переключатель, который вернет соответствующее значение Item_Two
когда $Test
проверяется на $ListA.Item_One
. У меня проблема, $ListA
может изменять количество значений в зависимости от ситуации. Я думал, что оператор switch был примерно таким:
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
После того, что вы сделали, $ listA не имеет элемента с именем "Item_One", поэтому выражение фактически равно NULL.
Это массив, и если вы хотите получить «A» из $ listA, вам нужно использовать $ 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
Я не думаю, что конструкция корпуса / переключателя подходит для этого случая. Похоже, он сделает то, что вам нужно.
$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") {