¿Cómo "comentar" (agregar comentario) en un lote / cmd?

883

Tengo un archivo por lotes que ejecuta varios scripts de Python que realizan modificaciones en la tabla.

  1. Quiero que los usuarios comenten los scripts de Python 1-2 que no quieren ejecutar, en lugar de eliminarlos del archivo por lotes (¡para que el siguiente usuario sepa que estos scripts existen como opciones!)

  2. También quiero agregar comentarios para llamar su atención específicamente sobre las variables que necesitan actualizar en el archivo Batch antes de ejecutarlo. Veo que puedo usar REM. Pero parece que eso es más para actualizar al usuario con progreso después de que lo haya ejecutado.

¿Existe una sintaxis para agregar un comentario más apropiadamente?

usuario1397044
fuente
66
Ver también excelentes respuestas aquí stackoverflow.com/q/12407800/1011025
ndemou
2
Puede usar Rem SthCommand o Use esta marca::: Sth
scientist_7

Respuestas:

881

El remcomando es de hecho para comentarios. No actualiza inherentemente a nadie después de ejecutar el script. Sin echoembargo, algunos autores de scripts pueden usarlo de esa manera en lugar de hacerlo , porque de forma predeterminada el intérprete por lotes imprimirá cada comando antes de procesarlo. Como los remcomandos no hacen nada, es seguro imprimirlos sin efectos secundarios. Para evitar imprimir un comando, agregue el prefijo @o, para aplicar esa configuración en todo el programa, ejecute @echo off. (Es echo offpara evitar imprimir más comandos; @es para evitar imprimir ese comando antes de que la configuración de eco tenga efecto).

Entonces, en su archivo por lotes, puede usar esto:

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py
Rob Kennedy
fuente
405
También puede usar dos dos puntos "::". Es una de las dos formas de agregar comentarios al archivo por lotes sin mostrar o ejecutar esa línea cuando se ejecuta el archivo por lotes. A diferencia de REM, esta línea no se mostrará independientemente de si ECHO off está en el archivo por lotes.
Brent81
12
@ Brent81 Siento que esta debería ser la respuesta correcta. Cuando se utiliza el resaltado de sintaxis, el comando REM no resalta el texto como "comentado".
Automático
17
El doble punto y coma es una "etiqueta inválida"; aquí hay un artículo que lo explica, y por qué su rendimiento puede ser mejor que REM (especialmente en disquetes), y no funcionará en bloques de código sangrados (solo en el primer carácter): robvanderwoude.com/comments.php
Michael Paulukonis
44
Interesante. Pensé que REM era el 'comentario de línea completa' y el doble colon era el 'comentario en línea', comoREM This whole line is a comment @echo off :: This comment is inline
Richard Smith
@Alhadis, el script de configuración de Perl está escrito en Bourne Shell, no en lotes de Windows, entonces, ¿cómo es relevante aquí? Además, el comando de dos puntos como sintaxis Bourne válida no es un "efecto secundario adicional"; es precisamente por eso que se usa en ese script Bourne . Se utiliza a favor de los #comentarios porque #, evidentemente, podría no ser un designador de comentarios válido en todos los shells que Configure está destinado a admitir; ver línea 3.
Rob Kennedy
956

Use ::oREM

::   commenttttttttttt
REM  commenttttttttttt

PERO (como la gente señaló):

  • Si usa en línea, debe agregar un &carácter:
    your commands here & :: commenttttttttttt
  • Dentro de la lógica anidada ( IF/ELSE, FORbucles, etc.) se usa REMporque ::da un error.
  • :: puede fallar dentro setlocal ENABLEDELAYEDEXPANSION
T.Todua
fuente
79
El colon doble :: Es el comentario .bat más limpio que existe. ¡Y se puede usar al comienzo o en el medio de una línea!
ATSiem el
10
No funcionó para mí cuando lo hice en línea de esta manera. cd "C:\Folder" ::this throws a syntax error
Shaun Rowan
3
También falla git add :: blah this is not a commentcon "fatal: pathpec 'blah' no coincide con ningún archivo"
Bob Stein
19
Para un comentario en la misma línea que ilustra el ejemplo, debe agregar &entre el código y el comentario ::. Para ilustrar, abra cmd prompt y ejecute dir ::blahlo que no enumera el contenido .y lo compara con lo dir & ::blahque sí lo hace
Rado
19
Advertencia, usar ::scripts de errores con setlocal ENABLEDELAYEDEXPANSIONyfor
Azevedo
50

No, los archivos por lotes antiguos simples se usan REMcomo comentario. ECHOes el comando que imprime algo en la pantalla.

Para "comentar" secciones del archivo que podría usar GOTO. Un ejemplo de todos estos comandos / técnicas:

REM it starts here the section below can be safely erased once the file is customised
ECHO Hey you need to edit this file before running it!  Check the instructions inside
ECHO Now press ctrl-c to interrupt execution or enter to continue
PAUSE
REM erase the section above once you have customised the file
python executed1.py
ECHO Skipping some stuff now
GOTO End
python skipped1.py
python skipped2.py
:END
python executed2.py

¿Qué puedo decir? Los archivos por lotes son una reliquia de tiempos pasados, son torpes y feos.

Puedes leer más en este sitio web .

EDITAR: modificó un poco el ejemplo para que contenga los elementos que aparentemente está buscando.

fvu
fuente
31

El :: en lugar de REM se usaba preferiblemente en los días en que las computadoras no eran muy rápidas. La línea REM'ed se lee y luego se ignora. :: 'línea ed se ignoran todo el camino. Esto podría acelerar su código en "los viejos tiempos". Además, después de un REM necesitas un espacio, después de :: no lo necesitas.

Y como se dijo en el primer comentario: puede agregar información a cualquier línea que sienta la necesidad de

SET DATETIME=%DTS:~0,8%-%DTS:~8,6% ::Makes YYYYMMDD-HHMMSS

En cuanto al salto de piezas. Poner REM delante de cada línea puede llevar bastante tiempo. Como se mencionó, usar GOTO para omitir partes es una manera fácil de omitir grandes piezas de código. Asegúrese de establecer un: LABEL en el punto donde desea que continúe el código.

SOME CODE

GOTO LABEL  ::REM OUT THIS LINE TO EXECUTE THE CODE BETWEEN THIS GOTO AND :LABEL

SOME CODE TO SKIP
.
LAST LINE OF CODE TO SKIP

:LABEL
CODE TO EXECUTE
Kees
fuente
1
¿Cómo se puede ignorar una línea de dos puntos sin ser leída? ¿No debe el intérprete leer primero la línea antes de reconocerla como una línea de dos puntos?
Rob Kennedy el
2
@RobKennedy mientras leo la respuesta, no lee nada después de ::, donde se lee todo después de REM.
James Jenkins
55
Si el intérprete de comandos deja de leer , @James, nunca más ejecutará el archivo. Obviamente, debe continuar leyendo para descubrir dónde termina el comentario y dónde comienza la siguiente línea del archivo. Tiene que ver con eso ::e remigualmente.
Rob Kennedy
2
@RobKennedy, también pensé que estaba implícito que solo se aplicaba a la línea en la que estaba el comando.
James Jenkins
77
@RobKennedy sí lee pero no analiza (o procesa) lo que lee, simplemente salta hasta el siguiente \ny luego comienza a analizar nuevamente [cita requerida]
xDaizu
25

Comentarios de varias líneas

Si hay un gran número de líneas que desea comentar, será mejor si puede hacer comentarios de varias líneas en lugar de comentar cada línea.

Vea esta publicación de Rob van der Woude en bloques de comentarios :

El lenguaje por lotes no tiene bloques de comentarios, aunque hay formas de lograr el efecto.

GOTO EndComment1
This line is comment.
And so is this line.
And this one...
:EndComment1

Puede usar GOTOLabel y: Label para hacer comentarios de bloque.

O bien, si el bloque de comentarios aparece al final del archivo por lotes, puede escribir EXITal final del código y luego cualquier número de comentarios para su comprensión.

@ECHO OFF
REM Do something
  •
  •
REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later
EXIT

Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...
Somnath Muluk
fuente
esto se usa a menudo en lotes híbridos y scripts VBS / JS, aunque se usaron si en iflugar de goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv
13

Poner comentarios en la misma línea con los comandos: use & :: comment

color C          & :: set red font color
echo IMPORTANT INFORMATION
color            & :: reset the color to default

Explicación:

&separa dos comandos , por lo que en este caso color Ces el primer comando y :: set red font colores el segundo.


Importante:

Esta declaración con comentario parece intuitivamente correcta:

goto error1         :: handling the error

pero no es un uso válido del comentario. Funciona solo porque gotoignora todos los argumentos más allá del primero. La prueba es fácil, esto gototampoco fallará:

goto error1 handling the error

Pero intento similar

color 17            :: grey on blue

falla la ejecución del comando debido a 4 argumentos desconocidos para el colorcomando: ::, grey, on, blue.

Solo funcionará como:

color 17     &      :: grey on blue

Entonces, el signo y es inevitable.

miroxlav
fuente
¿De otras respuestas, parece que el ampersand no es necesario?
RoG
3
@Snaptastic: las otras respuestas son realmente incorrectas en este punto, vea mi edición reciente.
miroxlav
Esta parece ser la forma correcta; Incluso se resalta como comentario en mi IDE.
baburao
5

Puedes comentar algo usando ::o REM:

your commands here
:: commenttttttttttt

o

your commands here
REM  commenttttttttttt

 

Para hacerlo en la misma línea que un comando, debe agregar un ampersand:

your commands here      & ::  commenttttttttttt

o

your commands here      & REM  commenttttttttttt

 

Nota:

  • Usar :: en lógica anidada ( IF-ELSE, FORbucles, etc.) causará un error. En esos casos, use REMen su lugar.
Pikamander2
fuente
Esto se basa en la respuesta de T.Todua. Sentí que su respuesta era buena, pero omitió algunos detalles importantes, pero retrocedieron mi edición, por lo que estoy convirtiendo mi revisión en su propia respuesta.
Pikamander2
Pikamander2, su revisión (también, señalada por el usuario @Rado se fusionó en la respuesta en ese momento y gracias por eso, simplemente preferí otro estilo para la respuesta y usé un estilo diferente.
T.Todua
1

Este es un tema antiguo y me gustaría agregar mi comprensión aquí para ampliar el conocimiento de este interesante tema.

La diferencia clave entre REM y :: es:

REM es un comando en sí mismo, mientras que :: NO lo es.

Podemos tratar :: como un token que tan pronto como el analizador CMD encuentre el primer espacio no en blanco en una línea es este :: token, simplemente saltará toda la línea y leerá la siguiente línea. Es por eso que REM debe ir seguido de al menos un espacio en blanco para poder funcionar como un comentario para la línea, mientras que :: no necesita ningún espacio en blanco detrás de ella.

Que REM es un comando en sí mismo puede entenderse mejor a partir de la siguiente sintaxis FOR

La sintaxis básica de FOR es la siguiente

FOR %v in (set) DO <Command> [command param] 

aquí <Command>puede haber cualquier comando válido Para que podamos escribir la siguiente línea de comando válida como remes un comando

FOR %i in (1,2,3) DO rem echo %i

Sin embargo, NO PODEMOS escribir la siguiente línea ya ::que no es un comando

FOR %i in (1,2,3) DO :: echo %i
jyao
fuente
3
técnicamente, ::es una etiqueta (no válida) (que explica su comportamiento) y, por lo tanto, no debe usarse (aunque todavía es bastante común)
Stephan
1

Puede agregar comentarios al final de un archivo por lotes con esta sintaxis:

@echo off
:: Start of code
...
:: End of code

(I am a comment
So I am!
This can be only at the end of batch files

Solo asegúrate de nunca usar paréntesis de cierre.

Atribuciones: Leo Guttirez Ramirez en https://www.robvanderwoude.com/comments.php

Wasif Hasan
fuente