2013-04-22 5 views
5

In PowerShell v2, sto tentando di aggiungere solo valori univoci a una matrice. Ho provato a usare un'istruzione if che dice, approssimativamente, If (-not $ Array-contiene 'SomeValue'), quindi aggiungi il valore, ma funziona sempre e solo la prima volta. Ho messo un semplice frammento di codice che mostra quello che sto facendo che non funziona e quello che ho fatto come soluzione alternativa che funziona. Qualcuno può farmi sapere dove è il mio problema?Powershell Aggiungi solo alla matrice se non esiste

Clear-Host 
$Words = @('Hello', 'World', 'Hello') 

# This will not work 
$IncorrectArray = @() 
ForEach ($Word in $Words) 
{ 
    If (-not $IncorrectArray -contains $Word) 
    { 
     $IncorrectArray += $Word 
    } 
} 

Write-Host ('IncorrectArray Count: ' + $IncorrectArray.Length) 

# This works as expected 
$CorrectArray = @() 
ForEach ($Word in $Words) 
{ 
    If ($CorrectArray -contains $Word) 
    { 
    } 
    Else 
    { 
     $CorrectArray += $Word 
    } 
} 

Write-Host ('CorrectArray Count: ' + $CorrectArray.Length) 

Il risultato del primo metodo è un array contenente un solo valore: "Ciao". Il secondo metodo contiene due valori: "Ciao" & "Mondo". Qualsiasi aiuto è molto apprezzato.

risposta

2

La prima volta, si valuta -non rispetto a un array vuoto, che restituisce true, che restituisce: ($ true -contains 'AnyNonEmptyString') che è vero, quindi viene aggiunto all'array. La seconda volta, si valuta -non contro un array non vuoto, che restituisce false, che restituisce: ($ false -contains 'AnyNonEmptyString') che è false, quindi non aggiunge all'array.

Prova rompere le vostre condizioni verso il basso per vedere il problema:

$IncorrectArray = @() 
$x = (-not $IncorrectArray) # Returns true 
Write-Host "X is $x" 
$x -contains 'hello' # Returns true 

quindi aggiungere un elemento alla matrice:

$IncorrectArray += 'hello' 
$x = (-not $IncorrectArray) # Returns false 
    Write-Host "X is $x" 
$x -contains 'hello' # Returns false 

vedere il problema? La tua sintassi corrente non esprime la logica che desideri.

È possibile utilizzare l'operatore notcontains:

Clear-Host 
$Words = @('Hello', 'World', 'Hello') 

# This will work 
$IncorrectArray = @() 
ForEach ($Word in $Words) 
{ 
    If ($IncorrectArray -notcontains $Word) 
    { 
    $IncorrectArray += $Word 
    } 
} 
5

per risolvere il tuo codice, provare -notcontains o almeno avvolgere le contiene-test in parantheses. ATM. il tuo test riporta:

Se "NON array" (se la matrice non esiste) contiene la parola.

Questo non ha senso. Quello che vuoi è:

Se matrice non contiene la parola ..

che è scritto in questo modo:

If (-not ($IncorrectArray -contains $Word)) 

-notcontains è ancora meglio, come @dugas suggerito.

+0

Grazie, è stato uno stupido errore. Apprezzo l'aiuto. – Llaslo