2012-03-02 17 views
6

La respuesta a esto es probable que sea trivial, pero he pasado media hora y todavía no puedo resolverlo.Formateo de una cadena Powershell que contiene valores hashtable

Supongamos que tengo una tabla hash la siguiente:

$hash = @{face='Off';} 

Lo que he tratado de hacer, se emite el valor de la "cara" al lado de algunos otros elementos de cadena.

Esto funciona:

Write-Host Face $hash['face'] 
=> Face Off 

Sin embargo, esto no es así:

Write-Host Face/$hash['face'] 
=> Face/System.Collections.Hashtable[face] 

De alguna manera la falta de un espacio ha afectado a la prioridad de los operadores - que ahora está evaluando $ almohadilla en forma de cadena, la [cara] concatenada después.

Tratando de resolver este problema de precedencia, probé:

Write-Host Face/($hash['face']) 
=> Face/ Off 

ahora tienen un espacio extra que no quiero. Esto funciona, pero no quiero que la línea extra sólo para reasignar:

$hashvalue = $hash['face'] 
write-host Face/$hashvalue 
=> Face/Off 

alguna idea de cómo conseguir este trabajo como una sola línea?

Respuesta

9

Claro, utilizar una subexpresión:

Write-Host Face/$($hash['face']) 

En general, yo sólo tiene que utilizar una cadena, si necesito un control preciso sobre los espacios en blanco con Write-Host:

Write-Host "Face/$($hash['face'])" 

Sí, en este Si necesita una subexpresión nuevamente, pero más porque simplemente no puede incluir una expresión como $foo['bar'] en una cadena; de lo contrario ;-)

Por cierto, $hash.face funciona igual de bien con mucho menos desorden visual.

+0

La subexpresión fue la clave aquí (que encierra en $()). Me di cuenta vagamente de su papel, pero había pasado por alto la aplicabilidad aquí. – llevera

+0

No aceptado para darles la oportunidad a otros de responder. Fue un poco rápido fuera de los bloques – llevera

3

En tales casos, y más si hay más variables involucradas, prefiero usar el formato de cadena. Mientras que en este caso se puede vivir con el $(..), tenga en cuenta que el formato de cadenas eliminará muchas dudas, costra y mejora la legibilidad:

write-host ("Face/{0}" -f $hash['face']) 
+0

Gracias por señalar la opción -f. Nunca lo había usado, y definitivamente puedo ver cómo sería que los escenarios más complejos fueran mucho más manejables. – llevera

+1

Llevera, es un operador, no una opción. – Joey

1

Además de utilizar expresiones sub como Joey se mostraron puede:

Utilice el formateo cadena:

Write-Host ('Face/{0}' -f $hash.face) 

Esto se pegará el valor de la llave de tope en el lugar de {0}

uso concatenación de cadenas:

Write-Host ('Face/' + $hash.face) 

Ambas requieren una expresión a ser evaluado que da salida a una cadena que se utiliza como parámetro ObjectWrite-Host 's.

+0

Creo que vale la pena señalar que para el ejemplo Write-Host ('Face /' + $ hash.face), los corchetes son importantes. Sin ellos, el + se trata como un literal de cadena. ¡El formateo de cuerdas Powershell toma un poco de tiempo para acostumbrarse! – llevera

+0

@llevera Sí, los parientes le dicen a PowerShell que primero debe ejecutar la concatenación de cadenas. El resultado es un objeto System.String que se utiliza como el valor del parámetro 'Write-Host-Object '. –

0

Otra opción es insertar su barra con la opción -Separator de Write-Host:

$hash = @{Face="off"} 
Write-Host ("Face",$hash.Face) -Separator '/' 
Cuestiones relacionadas