2009-03-06 24 views
13

Tengo una lista de archivos en una matriz. Quiero enumerar esos archivos y eliminar archivos específicos de él. Obviamente no puedo eliminar elementos de una matriz, por lo que quiero usar un ArrayList. Pero el siguiente no funciona para mí:¿Cómo crear una ArrayList desde una matriz en PowerShell?

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

Dónde $temp es una matriz.

¿Cómo puedo lograr eso?

Respuesta

27

No consigo que el constructor funcione. Sin embargo, esto parece funcionar:

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

También puede pasar un número entero en el constructor para establecer una capacidad inicial.

¿A qué te refieres cuando dices que quieres enumerar los archivos? ¿Por qué no puedes simplemente filtrar los valores deseados en una matriz nueva?

Editar:

Parece que se puede utilizar el constructor de matrices de esta manera:

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

Nota de la coma. Creo que lo que está sucediendo es que cuando llamas a un método .NET, siempre pasas los parámetros como una matriz. PowerShell desempaqueta esa matriz y la pasa al método como parámetros separados. En este caso, no queremos que PowerShell descomprima la matriz; queremos pasar la matriz como una sola unidad. Ahora, el operador de coma crea matrices. Entonces PowerShell desempaqueta la matriz, luego creamos la matriz nuevamente con el operador de coma. Creo que eso es lo que está pasando.

+0

¿Cómo se filtran los artículos? –

+0

@Mark, ¿puedes dar más información sobre cómo quieres decidir qué archivos eliminar? Además, ¿qué devuelve Get-ResourceFiles? –

+0

Tengo un archivo de texto con rutas relativas en él. Después de enumerar un directorio, quiero verificar si existe en el archivo, y si no existe, eliminarlo de la lista. Get-ResourceFiles simplemente devuelve una ruta como una cadena –

18

Probablemente la versión más corta:

[System.Collections.ArrayList]$someArray 

También es más rápido porque no llama relativamente caro New-Object.

+1

Para obtener una instancia, esta sería en realidad [System.Collections.ArrayList] $ someArray = @() que funciona para mí en Powershell 3.0, pero no verifiqué si powershell siempre usa ArrayList como la instancia de array. – npjohns

Cuestiones relacionadas