2012-02-22 54 views
25

que tienen una forma de hacer las matrices en otros languagues así:Powershell matrices multidimensionales

$x = "David" 
$arr = @() 

$arr[$x]["TSHIRTS"]["SIZE"] = "M" 

Esto genera un error.

+0

Como se señaló anteriormente, el código que ha publicado es un diccionario o hash, no una matriz común. – EBGreen

Respuesta

35

Se está intentando crear una matriz asociativa (hash). Pruebe lo siguiente secuencia de comandos

[email protected]{} 
$arr["david"] = @{} 
$arr["david"]["TSHIRTS"] = @{}  
$arr["david"]["TSHIRTS"]["SIZE"] ="M" 
$arr.david.tshirts.size 

nota la diferencia entre los hashes y arrays

$a = @{} # hash 
$a = @() # array 

matrices sólo pueden tener números enteros no negativos como los índices

+0

¡Funcionó como un compañero de encanto! ¡Gracias! –

+0

¿Sería esto un ejemplo de una tabla hash 3D? – Robin

20

de powershell.com:

PowerShell admite dos tipos de matrices multidimensionales: matrices dentados y verdaderas matrices multidimensionales.

Las matrices irregulares son matrices PowerShell normales que almacenan matrices como elementos. Este es el almacenamiento muy rentable porque dimensiones pueden ser de diferente tamaño:

$array1 = 1,2,(1,2,3),3 
$array1[0] 
$array1[1] 
$array1[2] 
$array1[2][0] 
$array1[2][1] 

verdaderos matrices multidimensionales siempre parecerse a una matriz cuadrada. Para crear dicha matriz, deberá acceder a .NET. La siguiente línea crea una matriz bidimensional con 10 y 20 elementos se asemeja a una matriz de 10x20:

$array2 = New-Object 'object[,]' 10,20 
$array2[4,8] = 'Hello' 
$array2[9,16] = 'Test' 
$array2 

para una matriz de 3-dimensioanl 10 * 20 * 10

$array3 = New-Object 'object[,,]' 10,20,10 
+4

No necesariamente tiene que acceder.NET: [PS] C: \> $ array = @ (, @ (, @ (, @()))) [PS] C: \> $ array [0] [0] [0] = 1 – mjolinor

+1

- Gracias por la información, pero usar .net es más legible (imao) –

+0

No son exactamente lo mismo, de todos modos. Uno tiene que ser referenciado como $ array [n, n], el otro como $ array [n] [n]. – mjolinor

11

Para extender en lo que, manojlds, Dicho anteriormente es que puedes anidar Hashtables. Puede que no sea una verdadera matriz multidimensional, pero le dará algunas ideas sobre cómo estructurar los datos. Un ejemplo:

$hash = @{} 

$computers | %{ 
    $hash.Add(($_.Name),(@{ 
     "Status" = ($_.Status) 
     "Date" = ($_.Date) 
    })) 
} 

Lo bueno de esto es que se puede hacer referencia a cosas como:

($hash."Name1").Status 

Además, es mucho más rápido que el conjunto de para encontrar cosas. Utilizo esto para comparar datos en lugar de usar coincidencias en Arrays.

$hash.ContainsKey("Name1") 

Espero que algo de eso ayude!

-Adam

1

Sabiendo que PowerShell pipes objects between cmdlets, es más común el uso de una gran variedad de PSCustomObjects:

$arr = @(
    New-Object PSObject -Property @{Name = "David"; Article = "TShirt"; Size = "M"} 
    New-Object PSObject -Property @{Name = "Eduard"; Article = "Trouwsers"; Size = "S"} 
) 

O para PowerShell versión 3 o superior:

$arr = @(
    [PSCustomObject]@{Name = "David"; Article = "TShirt"; Size = "M"} 
    [PSCustomObject]@{Name = "Eduard"; Article = "Trouwsers"; Size = "S"} 
) 

Y grep su selección como:

$arr | Where {$_.Name -eq "David" -and $_.Article -eq "TShirt"} | Select Size 
Cuestiones relacionadas