Matrici multidimensionali di PowerShell

Ho un modo di fare matrici in altri linguaggi come questo:

$x = "David" $arr = @() $arr[$x]["TSHIRTS"]["SIZE"] = "M" 

Questo genera un errore.

Stai provando a creare un array associativo (hash). Prova la seguente sequenza di comandi

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

Notare la differenza tra hash e array

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

Gli array possono avere solo numeri interi non negativi come indici

da powershell.com:

PowerShell supporta due tipi di matrici multidimensionali: matrici frastagliate e allineamenti multidimensionali reali.

Gli array frastagliati sono normali matrici PowerShell che memorizzano gli array come elementi. Questo è uno storage molto conveniente perché le dimensioni possono essere di dimensioni diverse:

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

I veri array multidimensionali assomigliano sempre a una matrice quadrata. Per creare un array di questo tipo, è necessario accedere a .NET. La riga successiva crea una matrice bidimensionale con 10 e 20 elementi che assomigliano a una matrice 10×20:

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

per un array 3-dimensioanl 10 * 20 * 10

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

Estendere ciò che, come detto sopra, è che puoi nidificare Hashtables. Potrebbe non essere un vero array multidimensionale ma darti qualche idea su come strutturare i dati. Un esempio:

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

Ciò che è bello di questo è che puoi fare riferimento a cose come:

 ($hash."Name1").Status 

Inoltre, è molto più veloce di array per la ricerca di cose. Lo uso per confrontare i dati anziché utilizzare la corrispondenza negli array.

 $hash.ContainsKey("Name1") 

Spero che questo aiuti!

-Adamo

Sapendo che PowerShell canalizza gli oggetti tra i cmdlet , è più comune utilizzare una matrice di oggetti personalizzati PSC:

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

Oppure per PowerShell versione 3 e successive:

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

E grep la tua selezione come:

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