2012-02-08 14 views
10

Encontré un comportamiento extraño en las matrices circundantes de Powershell y las comillas dobles. Si creo e imprimo el primer elemento en una matriz, como por ejemplo:Powershell enviando elementos de matriz al interpolar entre comillas dobles

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

Output:  
testing 

Todo funciona bien. Pero si pongo comillas dobles alrededor de ella: se evaluó

echo "$test[0]" 

Output: 
testing[0] 

Sólo la variable $ test y el marcador array [0] se trata, literalmente, como una cadena. La solución más sencilla es evitar la interpolación de variables de matriz entre comillas dobles o asignarlas primero a otra variable. Pero me preguntaba si este comportamiento es por diseño.

+0

No es obvio, pero en última instancia es un duplicado de [¿Cómo se puede usar la propiedad de un objeto en una cadena de comillas dobles?] (Http://stackoverflow.com/q/ 1145704/45375). – mklement0

Respuesta

15

Por lo tanto, cuando utiliza la interpolación, de manera predeterminada interpola solo la siguiente variable en toto. Así que cuando usted hace esto:

"$test[0]" 

Se ve la prueba $ como la siguiente variable, se da cuenta de que esto es una matriz y que no tiene buena manera de mostrar una matriz, por lo que decide que no puede interpolar y solo muestra la cadena como una cadena. La solución es decirle explícitamente PowerShell donde el bit a interpolar se inicia y donde se detiene:

"$($test[0])" 

Tenga en cuenta que este comportamiento es uno de mi razón principal para el uso de cadenas formateadas en lugar de confiar en la interpolación:

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

Debatí volver y agregar etiquetas de código, gracias @Andy Arismendi. – EBGreen

+1

Sus soluciones son efectivas, pero su explicación no es correcta. La interpolación de cadenas está _ntácticamente_ limitada a analizar solo '$ '. Cualquier carácter que no sea válido en un nombre de variable detiene el análisis, como '[' en este caso. PowerShell expande alegremente el _entire_ array '$ test', concretamente separando los elementos con un espacio único entre los elementos (por defecto). El siguiente '[0]' se trata simplemente como un literal y no tiene relación con la forma en que '$ test' se convierte en una cadena. – mklement0

6

En tales casos hay que hacer:

echo "$($test[0])" 

Otra alternativa es utilizar el formato de cadena de

echo "this is {0}" -f $test[0] 

Tenga en cuenta que este será el caso cuando esté accediendo a las propiedades en cadenas también. Como "$a.Foo" - debe escribirse como "$($a.Foo)"

Cuestiones relacionadas