2013-08-16 13 views
10

le seguenti opere come previsto:PowerShell: Due array dimensione

$values = @(("a", "b"), ("c", "d")) 
foreach($value in $values) 
{ 
    write-host "Value 0 =" $value[0] 
    write-host "Value 1 =" $value[1] 
} 

che i risultati (1) in:

Value 0 = a 
Value 1 = b 
Value 0 = c 
Value 1 = d 

Ma se cambio il $ valori delle variabili a:

$values = @(("a", "b")) 

il risultato (2) è:

Value 0 = a 
Value 1 = 
Value 0 = b 
Value 1 = 

mentre mi sarei aspettato il risultato (3) da:

Value 0 = a 
Value 1 = b 

La modifica del valore $ a:

$values = @(("a"), ("b")) 

dà lo stesso risultato di risultato (2) di cui sopra. Queste sono rappresentazioni di dati molto diverse.

Lo script che sto scrivendo deve essere in grado di gestire array bidimensionali in cui la prima dimensione ha lunghezza da 0 a N. Mi piacerebbe essere in grado di scrivere lo script in modo che se un elemento di primo livello ha bisogno da aggiungere (o rimuovere) che non devo modificare la logica dello script; Mi piacerebbe essere in grado di modificare solo i "dati".

Quindi la mia domanda è: come si annota un array bidimensionale in modo che il ciclo foreach foreach funzioni correttamente quando la prima dimensione dell'array ha una lunghezza di 1?

get-host risponde con:

Name    : ConsoleHost 
Version   : 2.0 
InstanceId  : 2338657f-e474-40d8-9b95-7e2b5f6a8acf 
UI    : System.Management.Automation.Internal.Host.InternalHostUserInterface 
CurrentCulture : en-US 
CurrentUICulture : en-US 
PrivateData  : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy 
IsRunspacePushed : False 
Runspace   : System.Management.Automation.Runspaces.LocalRunspace 

risposta

12

Questo è un altro caso in cui il comportamento gamma di movimentazione di PowerShell può causare risultati imprevisti.

penso che sarà necessario utilizzare il trucco virgola (l'operatore array) per ottenere il risultato desiderato:

$values = @(,("a", "b")) 
foreach($value in $values) 
{ 
    write-host "Value 0 =" $value[0] 
    write-host "Value 1 =" $value[1] 
} 

Risultato:

Value 0 = a 
Value 1 = b 

In realtà tutto ciò che serve è questo:

$values = ,("a", "b") 

Questo articolo spiega di più sulla gestione degli array di PowerShell:

http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx

+1

Grazie per il collegamento. Questa è una sintassi piuttosto strana. Interpreterei l'esempio che fornisci come definizione di $ values ​​[1,0] e $ values ​​[1,1]. –