special escape characters caracter batch windows batch-file quotes scripting

escape - Manejo de citas en scripts de lotes de Windows



cmd caracter de escape (7)

En un archivo por lotes de Windows, cuando hace lo siguiente:

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.


Depende de cómo quiera usar la variable. Si solo quiere usar el valor de la variable sin las comillas, puede usar la expansión retrasada y la sustitución de cadena, o el comando for :

@echo OFF SETLOCAL enabledelayedexpansion set myvar="C:/my music & videos"

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

Si usa expansión retrasada con sustitución de cadena, obtiene el valor de la variable sin las comillas:

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

También puedes usar 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. Usar sustitución de cadena y expansión retrasada para usar el valor de la variable sin comillas, pero use 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 para usar el valor de la variable sin comillas, pero tendrás que rodear la variable con comillas cuando la uses 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, realmente no hay una forma clara de usar una ruta o un nombre de archivo que contenga espacios integrados y / o & s en un archivo por lotes.


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)

Tu script debe escribirse de la siguiente manera:

@echo OFF set "myvar=C:/my music & videos"

Luego puede poner comillas alrededor de las variables según sea necesario.

Trabajar con el mensaje de CMD puede parecer esotérico a veces, pero el intérprete de comandos en realidad se comporta bastante bien al obedecer su lógica interna, solo necesita replantearse 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 de no usar comillas puede hacer que tengas espacios adicionales alrededor de tu variable que son difíciles de usar aviso al depurar su secuencia de comandos.

Por ejemplo, ambos de los siguientes son técnicamente válidos, pero puede tener espacios al final, por lo 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 variables en el intérprete de comandos de Windows, sin embargo, el método de comillas dobles es superior:

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

Ambas cosas no dejan nada a la interpretación, la variable tendrá exactamente los datos que está buscando.

texto fuerte Sin embargo, para su propósito, solo el método citado funcionará de forma válida porque está usando un carácter reservado

Por lo tanto, usarías:

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

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

Por lo tanto, si desea hacer eco de la cadena de la variable, el intérprete de CMD aún necesita que se le diga que se trata de una cadena de texto, o si no desea que se muestren las comillas, debe hacer una de las siguientes acciones:

repetir la variable WITH Quotes:

Echo."%myvar%"

repetir la variable SIN CITAS:

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

En los dos escenarios anteriores, puede hacer eco de la cadena sin comillas. Ejemplo de salida a continuación:

C:/Admin> Echo.%myvar:&=^&% C:/my music & videos C:/Admin> <nul SET /P="%myvar%" C:/my music & videos C:/Admin>


Esta es la forma correcta de hacerlo:

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

Las citas no se incluirán en el valor de la variable.


Intenta usar el carácter de escape ''^'', por ej.

set myvar=c:/my music ^& videos

Tendrás que tener cuidado cuando expandas myvar porque es posible que el shell no trate 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


Use jscript.

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

Luego, alguien me señaló en Joel Test , estaba particularmente enamorado del punto 2, y me propuse incluir 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 guiones trabajen juntos, en diferentes máquinas, con configuraciones ligeramente diferentes, oh Dios, era espantoso, en particular, establecer variables y pasar 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.

Eventualmente, puedo ser terco, arrojé todo y aproximadamente un día lo reescribí todo en JavaScript , y lo ejecuté desde el símbolo del sistema con CScript.

No he mirado hacia 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.


Debe tener las comillas si el texto que está configurando incluye ciertos caracteres, incluido & . Si su texto no incluye y luego no necesita las comillas.

Por ejemplo, si el texto era simplemente "c: / my music", podrías 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, puede escapar de los personajes problemáticos con ^^^ , pero tenga cuidado con ese enfoque ya que no es el único personaje del 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.


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

Observe que las comillas comienzan antes de myvar. En realidad es así de simple. Nota al margen: myvar no se puede repetir posteriormente a menos que esté envuelto en comillas porque & se leerá como un separador de comandos, pero aún así funcionará como una ruta.

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