por off lotes lenguaje informatica ejemplos crear como comandos batch bat avanzados archivos archivo batch-file coding-style comments

batch-file - lotes - echo off bat



¿Qué estilo de comentario debo usar en los archivos por lotes? (9)

He estado escribiendo algunos archivos por lotes, y encontré 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 redirección. ::<remark> no causa problemas pero rem <remark> produce errores.

¿Por qué entonces, la mayoría de las guías y ejemplos que veo usan el comando REM ? ¿Funciona :: funciona en todas las versiones de Windows?


Comentarios con REM

Un REM puede comentar una línea completa, también un cursor de multilínea al final de la línea, si no es el final del primer token.

REM This is a comment, the caret is ignored^ echo This line is printed REM This_is_a_comment_the_caret_appends_the_next_line^ echo This line is part of the remark

REM seguido de algunos caracteres .://= Funciona un poco diferente, no comenta con un signo, por lo que puede usarlo como comentario integrado.

echo First & REM. This is a comment & echo second

Pero para evitar problemas con archivos existentes como REM , REM.bat o REM;.bat solo se debe usar una variante modificada.

REM^;<space>Comment

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 final de línea caret.

:: This is also a comment^ echo This line is also a comment

Las etiquetas y también la etiqueta de comentario :: tienen una lógica especial entre bloques de paréntesis.
Abarcan siempre dos líneas SO: goto comando 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 se muestra una línea REM , 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.

REM This comment will result in an error %~ ...

Pero REM puede detener el analizador de lotes en una fase temprana, incluso antes de que se complete la fase de caracteres especiales.

@echo ON REM This caret ^ is visible

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 nada.
Pero la ventaja es que se pueden colocar en la misma línea, incluso sin & .
El signo igual asegura, que tal variable no puede existir.

echo Mytest set "var=3" %= This is a comment in the same line=%

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.

set $test=(%/n% %=Start of code=% ^ echo myMacro%/n% )


Buena pregunta ... He estado buscando esta funcionalidad por mucho tiempo ...

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:

echo this will show until the next REM &REM this will not show

también puede usar multilínea con el truco "NULL LABEL" ... (no olvide el ^ al final de la línea para la continuidad)

::(^ this is a multiline^ comment... inside a null label!^ dont forget the ^caret at the end-of-line^ to assure continuity of text^ )


Después de darme cuenta de que podía usar label :: para hacer comentarios y comentar, el código REM simplemente me parecía feo. Como se ha mencionado, los dos puntos dobles pueden causar problemas cuando se usan dentro del código bloqueado () , pero he descubierto una solución alternativa al alternar entre las etiquetas :: y : espacio

:: This, of course, does :: not cause errors. ( :: But : neither :: does : this. )

No es tan feo como REM , y en realidad agrega un poco de estilo a tu código.

Entonces, fuera de los bloques de código, uso :: y dentro de ellos alterno entre :: y :

Por cierto, para una gran cantidad de comentarios, como en el encabezado de su archivo por lotes, puede evitar completamente comandos y caracteres especiales simplemente goto sobre sus comentarios. Esto le permite utilizar cualquier método o estilo de marcado que desee, a pesar del hecho de que, si alguna vez CMD intentara procesar esas líneas, generaría un siseo.

@echo off goto :TopOfCode ======================================================================= COOLCODE.BAT Useage: COOLCODE [/?] | [ [/a][/c:[##][a][b][c]] INPUTFILE OUTPUTFILE ] Switches: /? - This menu /a - Some option /c:## - Where ## is which line number to begin the processing at. :a - Some optional method of processing :b - A third option for processing :c - A forth option INPUTFILE - The file to process. OUTPUTFILE - Store results here. Notes: Bla bla bla. :TopOfCode CODE . . .

Use la notación que desee * ''s, @ '' s, etc.


Esta respuesta intenta un resumen pragmático de las muchas y geniales respuestas en esta página:

La gran respuesta de jeb merece una mención especial, porque realmente profundiza y cubre muchos casos de vanguardia.
Cabe destacar que señala que una referencia de variable / parámetro mal construida, como %~ puede romper cualquiera de las soluciones a continuación, incluidas las líneas REM .

Comentarios de toda la línea : el único estilo soportado directamente:

  • REM (o variaciones de caso de los mismos) es la única construcción de comentarios oficiales , y es la opción más segura ; vea la útil respuesta de Joey .

  • :: es un hack (ampliamente utilizado) , que tiene sus pros y sus contras :

    • Pros :

    • Contras :

      • Los bloques internos (...) , :: pueden interrumpir el comando , y las reglas para un uso seguro son restrictivas y no son fáciles de recordar ; consulte a continuación.

Si desea usar :: , tiene estas opciones:

  • O bien : Para estar seguro, haga una excepción dentro de los bloques (...) y use REM allí, o no coloque comentarios dentro (...) completo.
  • O : Memorice las reglas dolorosamente restrictivas para el uso seguro de :: inside (...) , que se resumen en el siguiente fragmento de código:

@echo off for %%i in ("dummy loop") do ( :: This works: ONE comment line only, followed by a DIFFERENT, NONBLANK line. date /t REM If you followed a :: line directly with another one, the *2nd* one REM would generate a spurious "The system cannot find the drive specified." REM error message and potentially execute commands inside the comment. REM In the following - commented-out - example, file "out.txt" would be REM created (as an empty file), and the ECHO command would execute. REM :: 1st line REM :: 2nd line > out.txt & echo HERE REM NOTE: If :: were used in the 2 cases explained below, the FOR statement REM would *break altogether*, reporting: REM 1st case: "The syntax of the command is incorrect." REM 2nd case: ") was unexpected at this time." REM Because the next line is *blank*, :: would NOT work here. REM Because this is the *last line* in the block, :: would NOT work here. )

Emulación de otros estilos de comentarios - en línea y multilínea:

Tenga en cuenta que ninguno de estos estilos son compatibles directamente con el lenguaje por lotes , pero pueden ser emulados .

Comentarios en línea :

* Los fragmentos de código a continuación usan ver como un complemento para un comando arbitrario, a fin de facilitar la experimentación.
* Para hacer que los comandos SET funcionen correctamente con comentarios en línea, doble comillas la parte name=value ; por ejemplo, SET "foo=bar" . [1]

En este contexto podemos distinguir dos subtipos:

  • Los comentarios de EOL ([to-the-] end-of-line), que se pueden colocar después de un comando, e invariablemente se extienden hasta el final de la línea (nuevamente, cortesía de la respuesta de jeb ):

    • ver & REM <comment> aprovecha el hecho de que REM es un comando válido y & puede usarse 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 incluso más limitado que el uso de :: standalone.
  • Comentarios dentro de la línea , que se colocan entre varios comandos en una línea o, idealmente, dentro de un comando dado.
    Los comentarios dentro de la línea son la forma más flexible (de una sola línea) y , por definición, también se pueden usar como comentarios EOL.

    • ver & REM^. ^<comment^> & ver 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 > necesitaba ser eliminado por ^ , debido a los siguientes caracteres. no se puede utilizar como está: < > | (mientras que no ha escapado & o && o || comience el siguiente comando).

    • %= <comment> =% , como se detalla en la gran respuesta de dbenham , es la forma más flexible , porque 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 expande a la cadena vacía , siempre que el texto del comentario no contenga % ni :
      Al igual que REM , %= <comment> =% funciona bien tanto en el exterior como en el interior (...) bloques, pero es más distintivo visualmente; los únicos inconvenientes son que es más difícil de escribir, más fácil de equivocar sintácticamente, y no es ampliamente conocido, lo que puede dificultar la comprensión del código fuente que utiliza la técnica.

Comentarios multilínea (bloque de línea completa) :

  • La respuesta de James K muestra cómo usar una declaración goto y una etiqueta para delimitar un comentario de varias líneas de longitud y contenido arbitrarios (que en su caso utiliza 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 para terminar todas las líneas interiores con ^ .

  • La publicación del blog de Rob van der Woude menciona otra opción un tanto oscura que le permite finalizar un archivo con un número arbitrario de líneas de comentarios : una apertura ( solo hace que todo lo que venga después sea ignorado , 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 = y el valor combinado - es necesario en comandos como SET "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 forme parte de él accidentalmente.
(Aparte de eso: SET foo="bar" no solo no evitaría el problema, sino que haría que las comillas dobles formaran parte del valor ).
Tenga en cuenta que este problema es inherente a SET e incluso se aplica a los espacios en blanco finales que siguen al valor, por lo que es recomendable utilizar siempre el enfoque SET "foo=bar" .


James K, lamento haberme equivocado en una buena parte de lo que dije. La prueba que hice fue la siguiente:

@ECHO OFF ( :: But : neither :: does : this :: also. )

Esto cumple con su descripción de alternar pero falla con un ") fue inesperado en este momento". mensaje de error.

Hice algunas pruebas adicionales 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 ninguna dos líneas seguidas comenzando con dos puntos dobles (: :) y no terminando con dos puntos dobles . Considera lo siguiente:

@ECHO OFF ( : But : neither : does : this : cause : problems. )

¡Esto funciona!

Pero también considera esto:

@ECHO OFF ( : Test1 : Test2 : Test3 : Test4 : Test5 ECHO. )

La regla de tener un número par de comentarios no parece aplicarse cuando termina en un comando.

Desafortunadamente, esto es tan simple 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 como las declaraciones REM cuando se guarda el archivo. Pero no conozco un programa de este tipo y tampoco conozco ningún complemento para Notepad ++ que lo haga.


Otra alternativa es expresar el comentario como una expansión variable que siempre se expande a nada.

Los nombres de variable 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:

::This comment hack is not always safe within parentheses. ( %= This comment hack is always safe, even within parentheses =% )

También es un buen método para incorporar comentarios en línea.

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

El lead = no es necesario, pero me gusta por la simetría.

Hay dos restricciones:

1) el comentario no puede contener %

2) el comentario no puede contener :


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.


Esta página indica que el uso de "::" será más rápido bajo ciertas restricciones. Solo una cosa a considerar al elegir


tl; dr: REM es la forma documentada y admitida de incrustar comentarios en archivos por lotes.

:: es esencialmente una etiqueta en blanco a la que nunca se puede saltar, mientras que REM es un comando real que simplemente no hace nada. En ningún caso (al menos en Windows 7) la presencia de operadores de redirección causa un problema.

Sin embargo, se sabe que :: mal comportamiento en bloques en ciertas circunstancias, no se analiza como una etiqueta sino como una letra de unidad. Estoy un poco confuso sobre dónde exactamente, pero eso solo es suficiente para hacerme usar REM exclusivamente. Es la forma documentada y admitida de incrustar comentarios en archivos por lotes, mientras que :: es simplemente un artefacto de una implementación en particular.

Aquí hay un ejemplo donde :: produce un problema en un bucle FOR .

Este ejemplo no funcionará en un archivo llamado test.bat en su escritorio:

@echo off for /F "delims=" %%A in (''type C:/Users/%username%/Desktop/test.bat'') do ( ::echo hello>C:/Users/%username%/Desktop/text.txt ) pause

Si bien este ejemplo funcionará como un comentario correctamente:

@echo off for /F "delims=" %%A in (''type C:/Users/%username%/Desktop/test.bat'') do ( REM echo hello>C:/Users/%username%/Desktop/text.txt ) pause

El problema parece ser cuando se intenta redirigir la salida a un archivo. Mi mejor conjetura es que está interpretando :: como una etiqueta escapada llamada :echo .