2010-01-19 5 views
10

Estoy usando la función de expansión de cadenas para compilar nombres de archivos, y no entiendo muy bien qué está pasando.Extraña expansión de cadenas con powershell

consideran:

 

$baseName = "base" 
[int]$count = 1 
$ext = ".ext" 

$fileName = "$baseName$count$Ext" 
#filename evaluates to "base1.ext" -- expected 

#now the weird part -- watch for the underscore: 
$fileName = "$baseName_$count$Ext" 
#filename evaluates to "1.ext" -- the basename got dropped, what gives? 
 

Simplemente añadiendo el subrayado parece arrojar completamente fuera de la ranura de Powershell! Probablemente sea una regla de sintaxis extraña, pero me gustaría entender la regla. ¿Puede alguien ayudarme?

Respuesta

16

En realidad, lo que está viendo aquí es un problema para determinar cuándo se detiene una variable y comienza la siguiente. Está intentando buscar $ baseName_.

La solución es encerrar las variables entre llaves:

$baseName = "base" 
[int]$count = 1 
$ext = ".ext" 

$fileName = "$baseName$count$Ext" 
#filename evaluates to "base1.ext" -- expected 

#now the wierd part -- watch for the underscore: 
$fileName = "$baseName_$count$Ext" 
#filename evaluates to "1.ext" -- the basename got dropped, what gives? 

$fileName = "${baseName}_${count}${Ext}" 
# now it works 
$fileName 

Esperanza esto ayuda

+0

Sí, eso ayuda mucho. Gracias. – JMarsch

+2

También funciona, pero la solución de soporte es más limpia. $ fileName = "$ ($ baseName) _ $ ($ count) $ ($ Ext)"; $ fileName –

3

Underscore es un carácter legal en los identificadores. Por lo tanto, está buscando una variable llamada $baseName_. Lo cual no existe.

+0

Bueno, Pensé que era algo estúpido, no estoy decepcionado. Gracias. – JMarsch

7

también se puede utilizar "baseName`_ $ $ $ Ext recuento"

+0

Esta es mi solución alternativa preferida. –

Cuestiones relacionadas