Come "commentare" (aggiungere un commento) in un batch / cmd?


883

Ho un file batch che esegue diversi script Python che apportano modifiche alla tabella.

  1. Voglio che gli utenti commentino gli script 1-2 di Python che non vogliono eseguire, piuttosto che rimuoverli dal file batch (quindi il prossimo utente sa che questi script esistono come opzioni!)

  2. Voglio anche aggiungere commenti per portare alla loro attenzione in particolare le variabili che devono aggiornare nel file Batch prima di eseguirlo. Vedo che posso usare REM. Ma sembra che sia più per aggiornare l'utente con i progressi dopo averlo eseguito.

Esiste una sintassi per aggiungere in modo più appropriato un commento?


6
Vedi anche ottime risposte qui stackoverflow.com/q/12407800/1011025
ndemou

2
Puoi usare il Rem Sthcomando o usare questo segno::: Sth
scientist_7

Risposte:


881

Il remcomando è davvero per i commenti. Non aggiorna intrinsecamente nessuno dopo aver eseguito lo script. Alcuni autori di script potrebbero usarlo in questo modo invece che echo, perché, per impostazione predefinita, l'interprete batch stamperà ogni comando prima che venga elaborato. Poiché i remcomandi non fanno nulla, è sicuro stamparli senza effetti collaterali. Per evitare di stampare un comando, aggiungilo come prefisso @o, per applicare tale impostazione in tutto il programma, esegui @echo off. (È echo offper evitare di stampare ulteriori comandi; @è per evitare di stampare quel comando prima che le impostazioni dell'eco abbiano effetto.)

Quindi, nel tuo file batch, potresti usare questo:

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py

405
puoi anche usare due punti "::". È uno dei due modi per aggiungere osservazioni nel file batch senza visualizzare o eseguire quella riga quando viene eseguito il file batch. A differenza di REM, questa riga non verrà visualizzata indipendentemente dal fatto che ECHO off sia nel file batch.
Brent81,

12
@ Brent81 Penso che questa dovrebbe essere la risposta corretta. Quando si utilizza l'evidenziazione della sintassi, il comando REM non evidenzia il testo come "commentato".
Automatico,

17
Il doppio punto è un'etichetta "non valida"; ecco un articolo che lo spiega, e perché le sue prestazioni potrebbero essere migliori di REM (specialmente su floppy disk!), e non funzionerà in blocchi di codice rientrati (solo sul primo carattere): robvanderwoude.com/comments.php
Michael Paulukonis,

4
Interessante. Pensavo che REM fosse il "commento sull'intera linea" e che i due punti fossero il "commento in linea", tipoREM This whole line is a comment @echo off :: This comment is inline
Richard Smith,

@Alhadis, lo script Configure di Perl è scritto nella shell Bourne, non in batch di Windows, quindi come è rilevante qui? Inoltre, essendo il comando due punti sintassi di Bourne valido non è un "effetto collaterale bonus"; è precisamente il motivo per cui è usato in quella sceneggiatura di Bourne . È usato a favore dei #commenti perché #, evidentemente, potrebbe non essere un valido designatore di commenti in tutte le shell che Configure è destinata a supportare; vedi linea 3.
Rob Kennedy,

956

Usa ::oREM

::   commenttttttttttt
REM  commenttttttttttt

MA (come notato dalla gente):

  • Se si utilizza in linea, è necessario aggiungere &carattere:
    your commands here & :: commenttttttttttt
  • All'interno della logica nidificata ( IF/ELSE, FORloop, ecc ...) utilizzare REMperché ::genera un errore.
  • :: potrebbe non riuscire entro setlocal ENABLEDELAYEDEXPANSION

79
Il doppio colon :: È il commento .bat più pulito che ci sia. E può essere usato all'inizio o al centro di una linea!
ATSiem,

10
Non ha funzionato per me quando fatto in linea in questo modo. cd "C:\Folder" ::this throws a syntax error
Shaun Rowan,

3
Fallisce anche git add :: blah this is not a commentcon "fatal: pathspec 'blah' non corrisponde ad alcun file"
Bob Stein,

19
Per un commento sulla stessa riga illustrata nell'esempio, è necessario aggiungere &tra il codice e il commento ::. Per illustrare, apri il prompt di cmd ed esegui dir ::blahche non elenca il contenuto di .e confronta con dir & ::blah, che fa
Rado

19
Attenzione, usando ::gli script di bug con setlocal ENABLEDELAYEDEXPANSIONefor
Azevedo il

50

No, i semplici file batch vecchi usano REMcome commento. ECHOè il comando che stampa qualcosa sullo schermo.

Per "commentare" sezioni del file che è possibile utilizzare GOTO. Un esempio di tutti questi comandi / tecniche:

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

Cosa posso dire? i file batch sono una reliquia dei tempi andati, sono goffi e brutti.

Puoi leggere di più su questo sito web .

EDIT: modificato un po 'l'esempio per farlo contenere gli elementi che apparentemente stai cercando.


31

Il :: anziché il REM era preferibilmente usato ai tempi in cui i computer non erano molto veloci. La riga REM viene letta e quindi ignorata. :: 'ed line sono ignorati fino in fondo. Ciò potrebbe velocizzare il tuo codice nei "vecchi tempi". Ancora di più dopo un REM hai bisogno di uno spazio, dopo :: non lo fai.

E come detto nel primo commento: puoi aggiungere informazioni a qualsiasi linea che ritieni necessaria

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

Per quanto riguarda il salto delle parti. Mettere REM davanti a ogni linea può richiedere piuttosto tempo. Come accennato, usare GOTO per saltare le parti è un modo semplice per saltare grandi quantità di codice. Assicurati di impostare a: LABEL nel punto in cui desideri che il codice continui.

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

1
Come si può ignorare una linea a due punti senza essere letta? L'interprete non deve prima leggere la riga prima di riconoscerla come linea a due punti?
Rob Kennedy,

2
@RobKennedy mentre leggo la risposta, non legge nulla dopo il ::, dove tutto viene letto dopo REM.
James Jenkins,

5
Se l'interprete dei comandi smette di leggere , @James, non eseguirà mai più il file. Ovviamente deve continuare a leggere per scoprire dove finisce il commento e dove inizia la riga successiva del file. Deve farlo con ::e remugualmente.
Rob Kennedy,

2
@RobKennedy, ho anche pensato che fosse implicito che si applicava solo alla linea su cui si trovava il comando.
James Jenkins,

7
@RobKennedy legge ma non analizza (o elabora) ciò che legge, salta fino al successivo \ne poi ricomincia ad analizzare [citazione necessaria]
xDaizu

25

Commenti su più righe

Se ci sono un gran numero di righe che vuoi commentare, sarà meglio se puoi fare commenti su più righe piuttosto che commentare ogni riga.

Vedi questo post di Rob van der Woude sui blocchi di commenti :

Il linguaggio batch non ha blocchi di commenti, anche se ci sono modi per ottenere l'effetto.

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

Puoi usare GOTOEtichetta e: Etichetta per fare commenti a blocchi.

Oppure, se il blocco dei commenti appare alla fine del file batch, è possibile scrivere EXITalla fine del codice e quindi un numero qualsiasi di commenti per la comprensione.

@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...

questo è spesso usato in lotti ibrido & script VBS / JS, anche se hanno usato se ifinvece di goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv

13

Inserimento di commenti sulla stessa riga con i comandi: utilizzare & :: comment

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

Spiegazione:

&separa due comandi , quindi in questo caso color Cè il primo comando ed :: set red font colorè il secondo.


Importante:

Questa affermazione con commento sembra intuitivamente corretta:

goto error1         :: handling the error

ma non è un uso valido del commento. Funziona solo perché gotoignora tutti gli argomenti oltre il primo. La prova è semplice, anche questo gotonon fallirà:

goto error1 handling the error

Ma un tentativo simile

color 17            :: grey on blue

fallisce l'esecuzione del comando a causa di 4 argomenti sconosciuti al colorcomando: ::, grey, on, blue.

Funzionerà solo come:

color 17     &      :: grey on blue

Quindi la e commerciale è inevitabile.


Da altre risposte, sembra che la e commerciale non sia necessaria?
RoG

3
@Snaptastic - Le altre risposte sono effettivamente sbagliate in questo punto, vedi la mia recente modifica.
miroxlav,

Questo sembra essere il modo corretto; Viene anche evidenziato come commento nel mio IDE.
Baburao,

5

Puoi commentare qualcosa usando ::o REM:

your commands here
:: commenttttttttttt

o

your commands here
REM  commenttttttttttt

 

Per farlo sulla stessa riga di un comando, è necessario aggiungere una e commerciale:

your commands here      & ::  commenttttttttttt

o

your commands here      & REM  commenttttttttttt

 

Nota:

  • L'uso :: nella logica nidificata ( IF-ELSE, FORloop, ecc ...) provocherà un errore. In questi casi, utilizzare REMinvece.

Questo si basa sulla risposta di T.Todua. Ho sentito che la loro risposta era buona, ma hanno lasciato fuori alcuni dettagli importanti, ma hanno annullato la mia modifica, quindi sto trasformando la mia revisione in una sua risposta.
Pikamander2,

Pikamander2, la tua revisione (anche quella segnalata dall'utente è @Rado stata unita in risposta quella volta e grazie per quello, ho preferito solo un altro stile per la risposta e ho usato uno stile diverso.
T.Todua

1

Questo è un vecchio argomento e vorrei aggiungere la mia comprensione qui per espandere la conoscenza di questo argomento interessante.

La differenza chiave tra REM e :: è:

REM è un comando stesso, mentre :: NON è.

Possiamo considerare :: come token che non appena il parser CMD incontra il primo spazio non vuoto in una riga è questo :: token, salterà semplicemente l'intera riga e leggerà la riga successiva. Ecco perché REM dovrebbe essere seguito da almeno uno spazio vuoto per poter funzionare come un commento per la linea, mentre :: non ha bisogno di spazi vuoti dietro di esso.

Che REM sia un comando stesso può essere meglio compreso dalla seguente sintassi FOR

La sintassi FOR di base è la seguente

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

qui <Command>può esserci qualsiasi comando valido Quindi possiamo scrivere la seguente riga di comando valida come remè un comando

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

Tuttavia, NON POSSIAMO scrivere la riga seguente in quanto ::non è un comando

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

3
tecnicamente, ::è un'etichetta (non valida) (che spiega il suo comportamento) e quindi non dovrebbe essere usato (anche se è ancora abbastanza comune)
Stephan

1

È possibile aggiungere commenti alla fine di un file batch con questa sintassi:

@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

Assicurati solo di non usare mai una parentesi chiusa.

Attribuzioni: Leo Guttirez Ramirez su https://www.robvanderwoude.com/comments.php

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.