Usando o comando de alternância do PowerShell com a alteração de valores

2

Estou tentando usar o comando switch para selecionar algo de uma matriz. A matriz pode mudar de tamanho dependendo das informações de outra planilha.

Por exemplo:

C:\> $Test = A
C:\> $ListA
    Item_One       Item_Two
    --------       --------
    A              1
    B              2
    C              3

Eu quero criar um switch que retornará o valor correspondente de Item_Two quando $Test for verificado em relação a $ListA.Item_One . O problema que estou tendo é, $ListA pode alterar o número de valores dependendo da situação. A declaração de switch que eu estava pensando era algo assim:

switch ($Test)
{
    $ListA.Item_One {write-host $ListA.Item_two}
    default {"Not found"}
}

Quando executo esse código, ele acaba sendo o padrão, não consigo disparar a seção $ListA.Item_One . Existe uma maneira de fazer isso, ou de que outra forma eu posso fazer o que estou tentando fazer? Eu sei que posso usar um loop for-each, mas eu olho para ver se havia outras maneiras. Eu poderia imaginar que, se a lista fosse grande, levaria muito tempo para filtrar. No momento, a lista é de apenas 5 a 10 itens, mas pode crescer para mais de 40+ em um ano.

Editar: estou preenchendo a lista por meio de um arquivo .csv:

$listA = Import C:\File.csv
    
por Nick 07.07.2012 / 00:59

1 resposta

3

Com o que você fez, $ listA não tem nenhum elemento chamado "Item_One", de modo que a expressão seja efetivamente NULL
É uma matriz, e se você deseja obter "A" de $ listA, você precisa usar $ listA [0] .Item_One e $ ListA [0] .Item_two
Sem saber mais sobre essa situação, não tenho certeza do que sugerir ...
Você realmente tem tantos itens que você precisa de um CSV?
Se não tentar uma tabela de hash -

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

Novo após o comentário 7/9 de Nick:

Eu não acho que a estrutura case / switch seja adequada para este caso. Isso parece que vai fazer o que você precisa.

$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"
}

Dependendo de suas necessidades, a cláusula IF também pode ser iniciada assim

if ($_.item_one -match "A|B|C") {
    
por 09.07.2012 / 20:14

Tags