2009-02-11 4 views
46

En un archivo por lotes de Windows, cuando hace lo siguiente:Tratar con cotizaciones en guiones lotes de Windows

set myvar="c:\my music & videos"

la variable myvar se almacena con las comillas incluidas. Honestamente, me parece muy estúpido. Las comillas son solo para indicar dónde comienza y termina la secuencia, y no para almacenarla como parte del valor en sí.
¿Cómo puedo evitar que esto suceda?

Gracias.

+26

Oh mi - estás dando los primeros pasos en las áreas realmente enloquecedoras de scripts cmd. Buena suerte, lo vas a necesitar. Consulte http://stackoverflow.com/questions/180754/best-free-resource-for-learning-advanced-batch-file-usage/180767#180767 para obtener un puntero a un buen libro y algunos consejos. –

Respuesta

43
set "myvar=c:\my music & videos" 

Observe que las cotizaciones comienzan antes de myvar. En realidad es así de simple. Nota al margen: myvar no se puede repetir después a menos que esté entre comillas porque & se leerá como un separador de comandos, pero seguirá funcionando como una ruta.

http://ss64.com/nt/set.html en "Los nombres de variables pueden incluir espacios"

+0

realmente se puede repetir, solo tiene que envolverlo entre comillas;) 'echo"% myvar% "' – Fowl

+1

@Fowl pero también se repiten las dobles. – binki

1

Es imprescindible tiene las comillas si el texto está configurando incluye ciertos caracteres, incluyendo &. Si su texto no incluía &, entonces no necesitaría las comillas.

Por ejemplo, si el texto era sólo "C: \ mi música", entonces usted podría hacer:

set myvar = c:\my music 

Pero debido a que su texto tiene un & necesita las comillas.

Editar:

O como dice Dave en su respuesta que se puede escapar de los caracteres de un problema en ^^^, pero cuidado con ese enfoque como & no es el único personaje que necesita escapar. En la práctica, es mucho más fácil seguir con las comillas en lugar de escapar de todos los personajes problemáticos.

+0

Ese no es el problema. El problema es que las comillas se almacenan con el resto de la cadena como parte del valor. Eso es un problema para la concatenación de cadenas, comparación de cadenas y muchas otras cosas. – GetFree

+0

Es suficiente, pero si vas por la ruta de escapar, asegúrate de conocer todos los personajes que se deben escapar. – andynormancx

0

Pruebe usar el carácter de escape '^', p.

set myvar=c:\my music ^& videos 

Vas a tener que tener cuidado cuando se expande mivar porque el shell puede no tratar el & como un literal. Si lo anterior no funciona, intente insertar un símbolo de intercalación en la cadena también:

set myvar=c:\my music ^^^& videos 
6

Use jscript.

Hace muchas lunas (es decir, unos 8 años más o menos) estaba trabajando en un gran proyecto C++/VB6, y tenía varios bits de Batch Script para hacer partes de la compilación.

Luego, alguien me señaló en el Joel Test, estaba particularmente enamorado del punto 2, y me puse a juntar todos mis pequeños scripts de compilación en un único script de compilación. . .

y casi me rompe el corazón, haciendo que todos esos pequeños scripts funcionen juntos, en diferentes máquinas, con configuraciones ligeramente diferentes, Dios mío, fue espantoso, en particular las variables de configuración y el paso de parámetros. Fue realmente frágil, lo más mínimo lo rompería y requeriría 30 minutos de ajustes para volver a empezar.

Finalmente - puedo ser yo obstinado - Me tiraron todo el lote y en aproximadamente un día re-escribió todo en JavaScript, ejecutarlo desde la línea de comandos con CScript.

No he vuelto la vista atrás. Aunque en la actualidad es MSBuild y Cruise Control, si necesito hacer algo incluso ligeramente involucrado con un script por lotes, uso jscript.

+2

No es realmente una respuesta a la pregunta, pero como ya he estado en la-la-land de cmd.ejecutando cadena exe dentro y fuera de los archivos por lotes, estoy totalmente de acuerdo contigo. +1 – Tomalak

+2

Huelga decir que en estos días todo es Powershell. –

+1

@BinaryWorrier Mental, ¿seguro que obtendrías los tiempos y usar FALSO? (En realidad no es una broma por cierto, es genial) (Descargo de responsabilidad: no se ha determinado al 100% que usted y/o OP están hablando de scripts de compilación - ¡solo aquí en una base acosador!) –

34

Depende de cómo quiera usar la variable. Si lo que desea es utilizar el valor de la variable sin las comillas puede utilizar cualquiera de expansión retardada y la sustitución de cadenas, o el comando for:

@echo OFF 
SETLOCAL enabledelayedexpansion 

set myvar="C:\my music & videos" 

Como andynormancx estados, son necesarias las comillas ya que la cadena contiene la & . O puede escapar con el ^, pero creo que las citas son un poco más limpias.

Si utiliza la expansión retardada con sustitución de cadenas, se obtiene el valor de la variable sin las comillas:

@echo !myvar:"=! 
>>> C:\my music & videos 

También puede utilizar el comando for:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P 
) 
>>> C:\my music & videos 

Sin embargo, si desea utilizar la variable en un comando, debe usar el valor entrecomillado o adjuntar el valor de la variable entre comillas:

  1. El uso de sustitución de cadenas y la expansión retardada para utilizar el valor de la variable sin comillas, pero el uso de la variable en un comando:

    @echo OFF 
    SETLOCAL enabledelayedexpansion 
    
    set myvar="C:\my music & videos" 
    md %myvar% 
    @echo !myvar:"=! created. 
    
  2. Usando el comando for utilizar el valor de la variable sin comillas, pero tendrá que rodear la variable entre comillas cuando se utiliza en los comandos:

    @echo OFF 
    set myvar="C:\my music & videos" 
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P" 
        @echo %%P created. 
    ) 
    

para resumir, no hay realmente ninguna manera limpia para utilizar una ruta o nombre de archivo que contiene sp incrustado ases y/o & s en un archivo por lotes.

+0

Buena respuesta. Gracias. – GetFree

+3

Excelente respuesta. . . pero me hizo doler la cabeza. . . –

+1

@Binary Worrier; sí, los archivos por lotes tienden a hacer eso;) –

56

Ésta es la manera correcta de hacerlo:

set "myvar=c:\my music & videos" 

no se incluirán las comillas en el valor de la variable.

+0

¡Perfecto! ¡Funciona! –

+0

Esto es asombroso. No sabia sobre esto. –

+10

Muy útil, aunque esta respuesta merece el crédito http://stackoverflow.com/a/8582277/781695 – Medorator

2

El intérprete de comandos de Windows le permite usar las comillas en todo el comando set (válido en todas las versiones de Windows NT desde NT 4.0 a Windows 2012 R2)

Su script solo debe escribirse de la siguiente manera:

@echo OFF 

set "myvar=C:\my music & videos" 

luego puedes poner comillas alrededor de las variables según sea necesario.

Trabajar con el indicador de CMD puede parecer esotérico a veces, pero el intérprete de comandos se comporta de manera realmente sólida al obedecer su lógica interna, solo necesita volver a pensar las cosas.

De hecho, el comando set no requiere que uses comillas, pero tanto la forma en que haces tu asignación de variables como la forma en que el método no usa comillas puede hacer que tengas espacios adicionales alrededor de tu variable que son difíciles de detectar al depurar su script.

p. Ej. Ambos de los siguientes son técnicamente válida, pero puede tener espacios finales, así que no es una buena práctica:

set myvar=some text 
set myvar="some text" 

por ejemplo, Ambos de los siguientes son buenos métodos para establecer las variables en el intérprete de comandos de Windows, sin embargo, el método de la doble cotización es superior:

set "myvar=Some text" 
(set myvar=Some value) 

Ambos dejar nada a la interpretación de la variable tendrá exactamente los datos que busca.

fuerte de texto Sin embargo, para sus propósitos, sólo el método citado funcionará válidamente porque está utilizando un carácter reservado

Por lo tanto, se debería utilizar:

set myvar="c:\my music & videos" 

Sin embargo, a pesar de que la la variable IS se establece correctamente en esta cadena, cuando ECHO el aguijón, el intérprete de comandos interpretará el signo y la palabra clave para indicar que sigue otra instrucción.

Así que si quiere hacerse eco de la cadena a partir de la variable del intérprete CMD todavía tiene que ser dicho que es una cadena de texto, o si no desea que las comillas para mostrar que tiene que hacer uno de los siguientes:

eco de la variable con citas:

Echo."%myvar%" 

eco de la variable sin comillas:

Echo.%myvar:&=^&% 
<nul SET /P="%myvar%" 

En los dos escenarios anteriores se puede repetir la cadena sin comillas acaba de encajar nordeste. Ejemplo de resultado a continuación:

C:\Admin> Echo.%myvar:&=^&% 
C:\my music & videos 

C:\Admin> <nul SET /P="%myvar%" 
C:\my music & videos 
C:\Admin> 
+2

Siempre se puede usar una variable de forma segura con expansión retrasada. 'echo (! myvar!' Esto no necesita citas para la salida – jeb

Cuestiones relacionadas