2012-02-08 3 views
10

Ho trovato un comportamento strano negli array circostanti PowerShell e le doppie virgolette. Se creo e stampo il primo elemento di un array, ad esempio:Powershell che emette gli elementi dell'array quando interpolano tra virgolette

$test = @('testing') 
echo $test[0] 

Output:  
testing 

Tutto funziona correttamente. Ma se metto le virgolette attorno ad esso:

echo "$test[0]" 

Output: 
testing[0] 

solo la variabile di test è stata valutata $ e il marcatore array [0] è stato trattato letteralmente come una stringa. La soluzione semplice consiste semplicemente nell'eliminare l'interpolazione delle variabili dell'array tra virgolette doppie o assegnarle prima a un'altra variabile. Ma mi stavo chiedendo se questo comportamento è di progettazione?

+0

Non è ovvio, ma in definitiva si tratta di un duplicato di [Come si può usare la proprietà di un oggetto in una stringa con doppia citazione?] (Http://stackoverflow.com/q/ 1145704/45375). – mklement0

risposta

15

Quindi, quando si utilizza l'interpolazione, per impostazione predefinita interpola solo la variabile successiva in toto. Quindi, quando si esegue questa operazione:

"$test[0]" 

vede il $ test come variabile successiva, si rende conto che questo è un array e che non ha buon modo per visualizzare un array, quindi decide che non può interpolare e mostra semplicemente la stringa come una stringa. La soluzione è quella di dire esplicitamente powershell in cui il bit di interpolare inizia e dove si ferma:

"$($test[0])" 

Si noti che questo comportamento è uno dei miei ragione principale per l'utilizzo di stringhe formattate invece di basarsi su di interpolazione:

"{0}" -f $test[0] 
+0

Ho discusso tornando e aggiungendo i tag di codice, grazie @Andy Arismendi. – EBGreen

+1

Le tue soluzioni sono efficaci, ma la tua spiegazione non è corretta. L'interpolazione delle stringhe è _syntactically_ limitata all'analisi solo di '$ '. Qualsiasi carattere che non è valido in un nome di variabile interrompe l'analisi, come '[' in questo caso. PowerShell espande felicemente l'array _entire_ '$ test', ovvero separando gli elementi con un singolo spazio tra gli elementi (per impostazione predefinita). Il seguente '[0]' è semplicemente trattato come un letterale e non ha alcuna influenza su come '$ test' viene convertito in una stringa. – mklement0

6

In questi casi si deve fare:

echo "$($test[0])" 

Un'altra alternativa è quella di utilizzare la formattazione stringa

Si noti che questo sarà il caso quando si accede alle proprietà anche nelle stringhe. Come "$a.Foo" - deve essere scritto come "$($a.Foo)"