2009-03-06 8 views
13

Ho una lista di file in un array. Voglio enumerare quei file e rimuovere i file specifici da esso. Ovviamente non posso rimuovere elementi da un array, quindi voglio usare un ArrayList. Ma il seguente non funziona per me:Come creare un ArrayList da una matrice in PowerShell?

$temp = Get-ResourceFiles 
$resourceFiles = New-Object System.Collections.ArrayList($temp) 

Dove $temp è un array.

Come posso ottenere quello?

risposta

27

Non riesco a far funzionare il costruttore. Questo sembra comunque funzionare:

# $temp = Get-ResourceFiles 
$resourceFiles = New-Object System.Collections.ArrayList($null) 
$resourceFiles.AddRange($temp) 

È possibile passare anche un intero nel costruttore per impostare una capacità iniziale.

Cosa intendi quando dici di voler enumerare i file? Perché non puoi semplicemente filtrare i valori desiderati in un nuovo array?

Edit:

Sembra che è possibile utilizzare la funzione di costruzione Array in questo modo:

$resourceFiles = New-Object System.Collections.ArrayList(,$someArray) 

nota la virgola. Credo che quello che sta accadendo è che quando chiamate un metodo .NET, passate sempre i parametri come una matrice. PowerShell decomprime tale array e lo passa al metodo come parametri separati. In questo caso, non vogliamo che PowerShell disimballaggi l'array; vogliamo passare l'array come una singola unità. Ora, l'operatore virgola crea matrici. Quindi PowerShell scompatta l'array, quindi creiamo nuovamente l'array con l'operatore virgola. Penso che sia quello che sta succedendo.

+0

Come si filtrano gli articoli? –

+0

@ Mark, puoi fornire ulteriori informazioni su come decidere quali file rimuovere. Inoltre, cosa restituisce Get-ResourceFiles? –

+0

Ho un file di testo con relativi percorsi. Dopo aver enumerato una directory, desidero controllare se esiste nel file e, se non esiste, rimuoverla dall'elenco. Get-ResourceFiles restituisce appena un percorso come una stringa –

18

probabilmente la versione più breve:

[System.Collections.ArrayList]$someArray 

E 'anche più veloce perché non chiama relativamente costoso New-Object.

+1

Per ottenere un'istanza questo sarebbe in realtà [System.Collections.ArrayList] $ someArray = @() che funziona per me in Powershell 3.0, ma non ho verificato se PowerShell utilizza sempre ArrayList come istanza dell'array. – npjohns