Назад | Перейти на главную страницу

Использование команды переключателя PowerShell с изменением значений

Я пытаюсь использовать команду переключателя, чтобы выбрать что-то из массива. Размер массива может меняться в зависимости от информации из другой электронной таблицы.

Например:

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

Новое после комментария Ника 7/9:

Я не думаю, что конструкция корпуса / переключателя подходит для этого случая. Похоже, он сделает то, что вам нужно.

$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") {