Método ".count" do PowerShell que está causando processamento incorreto

0

Estou criando um array no PowerShell que nem sempre contém dados (às vezes está vazio). Eu preciso verificar se a matriz contém dados antes de tentar fazer qualquer coisa para os objetos da matriz. Quando uso o código a seguir, tudo funciona conforme o esperado:

$Array = @(“This”,”is”,”a”,”test”)
$Array | ForEach-Object {
If ($Array.Count -ge 1)
    {
    [string]$A = $_
    Write-Host $A
    }
}

Usando o código acima, recebo a seguinte saída:

This
is
a
test

O item acima verifica o .Count da matriz toda vez que ele processa um objeto na matriz (assim, ele pode verificar a contagem da matriz mil vezes ou mais dependendo do número de objetos na matriz). O que eu quero fazer é verificar a contagem da matriz apenas uma vez e antes de começar a processar os objetos da matriz. No entanto, o código a seguir não fornece a saída correta:

$Array = @(“This”,”is”,”a”,”test”)
If ($Array.Count -ge 1)
{
$Array | ForEach-Object {
    {
    [string]$A = $_
    Write-Host $A
    }
}
}

Eu recebo a seguinte saída quando executo o código acima:

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

Não faz Write-Host o valor da variável $ A como o código anterior mas, em vez disso, imprime o próprio código do PowerShell. Tudo o que fiz foi mover a verificação .Count para verificar a contagem antes do início do processamento de objetos na matriz. Por que recebo a saída acima quando movo a verificação de contagem de matriz antes da instrução ForEach-Object ? Preciso verificar a contagem de matriz toda vez que eu processar um objeto da matriz?

Obrigado

    
por STGdb 29.04.2014 / 17:37

1 resposta

4

Eu estou supondo a razão pela qual o Powershell imprime isso para o seu segundo exemplo

[string]$A = $_
Write-Host $A

[string]$A = $_
Write-Host $A

é porque o Powershell usa a chave dupla { { } } como um literal de string.

Quanto a como fazer isso funcionar, você deve testar o $Array antes de fazer o loop for.

Veja como o código deve ficar:

$Array = @(“This”,”is”,”a”,”test”)
if($Array.Count -ge 1){
    foreach($A in $Array){
        Write-Host $A
    }
}

E como um liner (ish)

$Array = @(“This”,”is”,”a”,”test”) 
if($Array.Count -ge 1){ $Array| %{Write-Host $_}}
    
por 29.04.2014 / 17:46