He estado escribiendo algunos archivos por lotes, y me encontré con esta guía del usuario , que ha sido bastante informativa. Una cosa que me mostró fue que las líneas se pueden comentar no solo con REM
, sino también con ::
. Dice:
Los comentarios en el código de lote se pueden hacer usando dos puntos dobles, esto es mejor que usar el comando REM porque las etiquetas se procesan antes de los símbolos de redireccionamiento.
::<remark>
no causa problemas perorem <remark>
produce errores.
¿Por qué entonces, la mayoría de las guías y ejemplos que veo usan el REM
comando? ¿ ::
Funciona en todas las versiones de Windows?
batch-file
coding-style
comments
MikeFHay
fuente
fuente
command.exe
), no paracmd.exe
el procesador de comandos NT como se encuentra en Windows 2000 en adelante.rem <remark>
funciona bien en este último (desde al menos Windows XP), yREM
es la restricción oficial y la opción más segura en general; Si bien::
tiene sus ventajas, en última instancia es un truco que es problemático dentro de los(…)
bloques (como se discute en muchas respuestas aquí).Respuestas:
tl; dr:
REM
es la forma documentada y compatible de incrustar comentarios en archivos por lotes.::
es esencialmente una etiqueta en blanco a la que nunca se puede saltar, mientras queREM
es un comando real que simplemente no hace nada. En ninguno de los casos (al menos en Windows 7) la presencia de operadores de redireccionamiento causa un problema.Sin embargo,
::
se sabe que se comportan mal en bloques bajo ciertas circunstancias, siendo analizados no como una etiqueta sino como una especie de letra de unidad. Estoy un poco confuso sobre dónde exactamente, pero eso solo es suficiente para hacerme usarREM
exclusivamente. Es la forma documentada y compatible de incrustar comentarios en archivos por lotes, mientras que::
es simplemente un artefacto de una implementación particular.Aquí hay un ejemplo donde se
::
produce un problema en unFOR
bucle.Este ejemplo no funcionará en un archivo llamado
test.bat
en su escritorio:Si bien este ejemplo funcionará correctamente como comentario:
El problema parece ser al intentar redirigir la salida a un archivo. Mi mejor suposición es que se está interpretando
::
como una etiqueta escapada llamada:echo
.fuente
%VAR%
variables se expanden. Suponga que tiene (incorrectamente)set TARGET=C:\Program Files (x86)\"foo.exe"
, y dentro de unaDO(..)
expresión que tiene:: echo %TARGET%
obtendrá un error porque(x86)
se expande antes de que se evalúe toda la expresión, lo que lleva a unaDO(..)
expresión no válida y errores muy inexplicables (en este caso "\ Microsoft fue inesperado en este momento " ). Ni siquiera necesitas|
o>
en tu expresión. Sin embargo, A::
no es un comentario realREM
.Comentarios con REM
A
REM
puede remarcar una línea completa, también un cursor multilínea al final de la línea, si no es el final del primer token.REM seguido de algunos caracteres
.:\/=
funciona un poco diferente, no comenta un ampersand, por lo que puede usarlo como comentario en línea.Pero para evitar problemas con archivos existentes como
REM
,REM.bat
oREM;.bat
solo se debe usar una variante modificada.Y para el personaje
;
también está permitido uno de;,:\/=
REM es aproximadamente 6 veces más lento que
::
(probado en Win7SP1 con 100000 líneas de comentarios).Para un uso normal no es importante (58 µs versus 360 µs por línea de comentario)
Comentarios con ::
A
::
siempre ejecuta un cursor de fin de línea.Las etiquetas y también la etiqueta de comentario
::
tienen una lógica especial en los bloques de paréntesis.Abarcan siempre dos líneas SO: el comando goto no funciona .
Por lo tanto, no se recomiendan para bloques de paréntesis, ya que a menudo son la causa de los errores de sintaxis.
Con
ECHO ON
unaREM
línea se muestra, pero no una línea comentada con::
Ambos realmente no pueden comentar el resto de la línea, por lo que un simple
%~
causará un error de sintaxis.Pero REM puede detener el analizador por lotes en una fase temprana, incluso antes de que se complete la fase de caracteres especiales.
Puede usar & REM o & :: para agregar un comentario al final de la línea de comando. Este enfoque funciona porque '&' introduce un nuevo comando en la misma línea.
Comentarios con signos de porcentaje% = comentario =%
Existe un estilo de comentario con signos de porcentaje.
En realidad, estas son variables pero se expanden a la nada.
Pero la ventaja es que se pueden colocar en la misma línea, incluso sin ella
&
.El signo igual asegura que tal variable no pueda existir.
El estilo de porcentaje se recomienda para macros por lotes, ya que no cambia el comportamiento del tiempo de ejecución, ya que el comentario se eliminará cuando se defina la macro.
fuente
%=
los comentarios son meticulosos entre comillas, es decir,set foo=bar %=baz
los resultados enfoo
la ampliación abar %=baz
, como lo haceset foo="bar" %=baz
, mientras que sóloset "foo=bar" %=baz
da lugar afoo
la ampliación debar
la forma prevista.set "foo=bar"
vale la pena recomendar usar el estilo de comillas en general, porque es la forma más robusta que delimita claramente el valor. El tema que usted está describiendo es inherenteset
's comportamiento, y no es específico de%= … =%
los comentarios: A menos que utilice"var=val"
citar,set
considera todo lo que sigue el=
valor, incluyendo espacios en blanco (hasta el final de la línea o, en su caso, el inicio de el siguiente comando en línea).Otra alternativa es expresar el comentario como una expansión variable que siempre se expande a nada.
Los nombres de las variables no pueden contener
=
, excepto las variables dinámicas no documentadas como%=ExitCode%
y%=C:%
. Ningún nombre de variable puede contener un=
después de la primera posición. Así que a veces uso lo siguiente para incluir comentarios dentro de un bloque entre paréntesis:También es un buen método para incorporar comentarios en línea.
La guía
=
no es necesaria, pero me gusta si es por la simetría.Hay dos restricciones:
1) el comentario no puede contener
%
2) el comentario no puede contener
:
fuente
%=ExitCode%
? Ordenado. ¡Aprenda algo nuevo cada día!=
es necesario. Pero no parece ser.=
para que algo como% = ExitCode =% sea un "comentario" y no una variable dinámica. Prefiero usar un estilo que siempre funcione (a excepción de las limitaciones indicadas al final de la respuesta, por supuesto).Después de darme cuenta de que podía usar la etiqueta
::
para hacer comentarios y comentar el código,REM
simplemente me pareció feo. Como se ha mencionado, el doble punto puede causar problemas cuando se usa dentro del()
código bloqueado, pero he descubierto una solución alternativa al alternar entre las etiquetas::
y:
spaceNo es feo
REM
, y en realidad agrega un poco de estilo a su código.Entonces, fuera de los bloques de código que uso
::
y dentro de ellos alterno entre::
y:
.Por cierto, para grandes trozos de comentarios, como en el encabezado de su archivo por lotes, puede evitar comandos y caracteres especiales por completo simplemente
goto
sobre sus comentarios. Esto le permite utilizar cualquier método o estilo de marcado que desee, a pesar de que siCMD
alguna vez tratara de procesar esas líneas, arrojaría un silbido.Usa cualquier notación que desees
*
,@
etc.fuente
/?
interruptor para que imprima este menú?:PrintHelp
) para esta respuesta que de hecho hace lo que @hoang pide. Yo uso <HELP> y </HELP> como marcadores pero puedes usar lo que te convenga.Esta respuesta intenta un resumen pragmático de las muchas excelentes respuestas en esta página:
La gran respuesta de Jeb merece una mención especial, porque realmente va en profundidad y cubre muchos casos extremos.
En particular, señala que una referencia de variable / parámetro mal construida, como
%~
puede romper cualquiera de las soluciones a continuación, incluidas lasREM
líneas .Comentarios de línea completa : el único estilo directamente compatible:
REM
(o las variaciones de los casos) es el único comentario oficial , y es la opción más segura ; vea la útil respuesta de Joey .::
es un hack (ampliamente utilizado) , que tiene pros y contras :Pros :
Contras :
(...)
bloques,::
puede romper el comando , y las reglas para un uso seguro son restrictivas y no son fáciles de recordar : consulte a continuación.Si no desea utilizar
::
, tienes estas opciones:(...)
bloques y utilícelosREM
allí, o no coloque comentarios dentro del(...)
todo.::
interior(...)
, que se resumen en el siguiente fragmento:Emulación de otros estilos de comentarios : en línea y multilínea:
Tenga en cuenta que ninguno de estos estilos es compatible directamente con el idioma del lote , pero puede emularse .
Comentarios en línea :
* Los fragmentos de código a continuación se utilizan
ver
como sustituto de un comando arbitrario, para facilitar la experimentación.* Para que los
SET
comandos funcionen correctamente con comentarios en línea, comillas laname=value
parte; por ejemplo,SET "foo=bar"
. [1]En este contexto podemos distinguir dos subtipos:
Los comentarios de EOL ([al final de la línea]), que se pueden colocar después de un comando, y se extienden invariablemente hasta el final de la línea (nuevamente, cortesía de la respuesta de jeb ):
ver & REM <comment>
aprovecha el hecho de queREM
es un comando válido y&
se puede utilizar para colocar un comando adicional después de uno existente.ver & :: <comment>
también funciona, pero en realidad solo se puede usar fuera de los(...)
bloques , porque su uso seguro allí es aún más limitado que el uso::
independiente.Comentarios dentro de la línea , que se colocan entre múltiples comandos en una línea o, idealmente, incluso dentro de un comando dado.
Los comentarios dentro de la línea son la forma más flexible (una sola línea) y , por definición, también se pueden usar como comentarios EOL.
ver & REM^. ^<comment^> & ver
permite insertar un comentario entre comandos (nuevamente, cortesía de la respuesta de jeb ), pero tenga en cuenta cómo<
y>
necesita ser^
escapado, porque los siguientes caracteres. no se puede usar como está:< > |
(mientras que sin escape&
o&&
o||
iniciar el siguiente comando).%= <comment> =%
, como se detalla en la gran respuesta de dbenham , es la forma más flexible , ya que se puede colocar dentro de un comando (entre los argumentos) .Aprovecha la sintaxis de expansión variable de una manera que garantiza que la expresión siempre se expanda a la cadena vacía , siempre que el texto del comentario no contenga
%
ni:
Me gusta
REM
,%= <comment> =%
funciona bien tanto en(...)
bloques externos como internos , pero es más distintivo visualmente; Los únicos inconvenientes son que es más difícil de escribir, más fácil equivocarse sintácticamente y no es ampliamente conocido, lo que puede dificultar la comprensión del código fuente que utiliza la técnica.Comentarios de varias líneas (bloque de líneas completas) :
La respuesta de James K muestra cómo usar una
goto
declaración y una etiqueta para delimitar un comentario de varias líneas de longitud y contenido arbitrarios (que en su caso usa para almacenar información de uso).La respuesta de Zee muestra cómo usar una "etiqueta nula" para crear un comentario de varias líneas, aunque se debe tener cuidado de terminar con todas las líneas interiores
^
.La publicación del blog de Rob van der Woude menciona otra opción algo oscura que le permite finalizar un archivo con un número arbitrario de líneas de comentarios : una apertura
(
solo hace que se ignore todo lo que viene después , siempre que no contenga un (no^
-escaped))
, es decir, siempre que el bloque no esté cerrado .[1] Usar
SET "foo=bar"
para definir variables, es decir, poner comillas dobles alrededor del nombre y=
el valor combinado , es necesario en comandos tales comoSET "foo=bar" & REM Set foo to bar.
, para garantizar que lo que sigue al valor de la variable deseada (hasta el siguiente comando, en este caso un solo espacio) no se convierte accidentalmente en parte de él.(Como comentario aparte:
SET foo="bar"
no solo no evitaría el problema, sino que haría que las comillas dobles fueran parte del valor ).Tenga en cuenta que este problema es inherente
SET
e incluso se aplica al espacio en blanco final accidental que sigue al valor, por lo que es recomendable utilizar siempre elSET "foo=bar"
enfoque.fuente
Esta página dice que el uso de "::" será más rápido bajo ciertas restricciones. Solo una cosa a tener en cuenta al elegir
fuente
::
puede ser 6 veces más rápido queREM
buena pregunta ... He estado buscando esta funcionalidad por mucho tiempo también ...
Después de varias pruebas y trucos, parece que la mejor solución es la más obvia ...
-> la mejor manera que encontré para hacerlo, evitando que falle la integridad del analizador, es reutilizando REM:
también puede usar multilínea con el truco "NULL LABEL" ... (no olvide el ^ al final de la línea para la continuidad)
fuente
James K, lo siento, me equivoqué en una buena parte de lo que dije. La prueba que hice fue la siguiente:
Esto cumple con su descripción de alternar pero falla con un ") fue inesperado en este momento". mensaje de error.
Hice algunas pruebas más hoy y descubrí que alternar no es la clave, pero parece que la clave es tener un número par de líneas, no tener dos líneas seguidas que comiencen con dos puntos (: :) y no terminen en dos puntos . Considera lo siguiente:
¡Esto funciona!
Pero también considere esto:
La regla de tener un número par de comentarios no parece aplicarse cuando termina en un comando.
Desafortunadamente, esto es tan ardiente que no estoy seguro de querer usarlo.
Realmente, la mejor solución, y la más segura que se me ocurre, es si un programa como Notepad ++ leería REM como dos puntos dobles y luego escribiría dos puntos dobles como declaraciones REM cuando se guarda el archivo. Pero no conozco dicho programa y tampoco conozco ningún complemento para Notepad ++ que lo haga.
fuente
Una discusión muy detallada y analítica sobre el tema está disponible en ESTA página
Tiene los códigos de ejemplo y los pros / contras de diferentes opciones.
fuente
Hay varias formas de comentar en un archivo por lotes
1) Usando rem
Esta es la forma oficial. Al parecer, lleva más tiempo ejecutarlo que
::
, aunque aparentemente deja de analizarse antes de que se procesen los cuidados. El porcentaje de expansión ocurre antes de rem y::
se identifica, por lo que el uso incorrecto de porcentaje, es decir%~
, causará errores si hay porcentajes presentes. Seguro de usar en cualquier lugar en bloques de código.2) El uso de etiquetas
:
,::
o:;
etc.Para
:: comment
, ': comentario' es un nombre de etiqueta no válido porque comienza con un carácter no válido. Sin embargo, está bien usar dos puntos en el medio de una etiqueta. Si un espacio comienza al comienzo de la etiqueta, se elimina se: label
convierte en:label
. Si aparece un espacio o dos puntos en el medio de la etiqueta, el resto del nombre no se interpreta, lo que significa que si hay dos etiquetas:f:oo
y:f rr
, ambas se interpretarán como:f
y solo se saltará a la etiqueta definida más tarde en el archivo. El resto de la etiqueta es efectivamente un comentario. Hay varias alternativas a::
, enumeradas aquí . Nunca puedesgoto
ocall
una::foo
etiqueta.goto :foo
ygoto ::foo
no funcionaráFuncionan bien fuera de los bloques de código pero después de una etiqueta en un bloque de código, inválido o no, tiene que haber una línea de comando válida.
:: comment
es de hecho otro comando válido. Lo interpreta como un comando y no una etiqueta; El comando tiene prioridad. Cuál es el comando para cd al::
volumen, que funcionará si ha ejecutadosubst :: C:\
, de lo contrario obtendrá un error de no encontrar el volumen. Es por eso:;
que podría decirse que es mejor porque no se puede interpretar de esta manera y, por lo tanto, se interpreta como una etiqueta, que sirve como el comando válido. Esto no es recursivo, es decir, la siguiente etiqueta no necesita un comando después. Por eso vienen en parejas.Debe proporcionar un comando válido después de la etiqueta, por ejemplo
echo something
. Una etiqueta en un bloque de código tiene que venir con al menos un comando válido, por lo que las líneas vienen en pares de dos. Obtendrá un)
error inesperado si hay un espacio o un paréntesis de cierre en la siguiente línea. Si hay un espacio entre las dos::
líneas, obtendrá un error de sintaxis no válido.También puede usar el operador de intercalación en el
::
comentario de la siguiente manera:Pero necesita el seguimiento
:;
por la razón indicada anteriormente.Está bien siempre que haya un número par. Esta es sin duda la mejor manera de comentar, con 4 líneas y
:;
. Con:;
usted no obtiene ningún error que deba suprimirse con2> nul
osubst :: C:\
. Puede usarsubst :: C:\
para que el error de volumen no encontrado desaparezca, pero eso significa que también tendrá que poner C: en el código para evitar que su directorio de trabajo se convierta::\
.Para comentar al final de una línea puede hacer
command &::
ocommand & rem comment
, pero todavía tiene que haber un número par, así:El primero
echo hello & :;yes
tiene un comando válido en la siguiente línea pero el segundo& :;yes
no, por lo que necesita uno, es decir, el:;
.3) Usar una variable de entorno no válida
%= comment =%
. En un archivo por lotes, las variables de entorno que no están definidas se eliminan del script. Esto hace posible usarlos al final de una línea sin usar&
. Es personalizado usar una variable de entorno no válida, es decir, una que contenga un signo igual. No se requieren los iguales adicionales, pero lo hace parecer simétrico. Además, los nombres de variables que comienzan con "=" están reservados para variables dinámicas no documentadas. Esas variables dinámicas nunca terminan con "=", por lo que al usar un "=" al principio y al final del comentario, no hay posibilidad de un choque de nombres. El comentario no puede contener%
o:
.4) Como un comando, redirigiendo stderr a nul
5) Al final de un archivo, todo después de un paréntesis no cerrado es un comentario
fuente