'How to "comment-out" (add comment) in a batch/cmd?
I have a batch file that runs several python scripts that do table modifications.
I want to have users comment out the 1-2 python scripts that they don't want to run, rather than removing them from the batch file (so the next user knows these scripts exist as options!)
I also want to add comments to bring to their attention specifically the variables they need to update in the Batch file before they run it. I see that I can use
REM
. But it looks like that's more for updating the user with progress after they've run it.
Is there a syntax for more appropriately adding a comment?
Solution 1:[1]
The rem
command is indeed for comments. It doesn't inherently update anyone after running the script. Some script authors might use it that way instead of echo
, though, because by default the batch interpreter will print out each command before it's processed. Since rem
commands don't do anything, it's safe to print them without side effects. To avoid printing a command, prefix it with @
, or, to apply that setting throughout the program, run @echo off
. (It's echo off
to avoid printing further commands; the @
is to avoid printing that command prior to the echo setting taking effect.)
So, in your batch file, you might use this:
@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py
Solution 2:[2]
Use ::
or REM
:: commenttttttttttt
REM commenttttttttttt
BUT (as people noted):
- if they are not in the beginning of line, then add
&
character:your commands here & :: commenttttttttttt
- Inside nested parts (
IF/ELSE
,FOR
loops, etc...)::
should be followed with normal line, otherwise it gives error (useREM
there). ::
may also fail withinsetlocal ENABLEDELAYEDEXPANSION
Solution 3:[3]
No, plain old batch files use REM
as a comment. ECHO
is the command that prints something on the screen.
To "comment out" sections of the file you could use GOTO
. An example of all these commands/techniques:
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
What can I say? batch files are a relic of times long gone, they're clunky and ugly.
You can read more on this website.
EDIT: modified the example a bit to have it contain the elements you are apparently looking for.
Solution 4:[4]
The :: instead of REM was preferably used in the days that computers weren't very fast. REM'ed line are read and then ingnored. ::'ed line are ignored all the way. This could speed up your code in "the old days". Further more after a REM you need a space, after :: you don't.
And as said in the first comment: you can add info to any line you feel the need to
SET DATETIME=%DTS:~0,8%-%DTS:~8,6% ::Makes YYYYMMDD-HHMMSS
As for the skipping of parts. Putting REM in front of every line can be rather time consuming. As mentioned using GOTO to skip parts is an easy way to skip large pieces of code. Be sure to set a :LABEL at the point you want the code to continue.
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
Solution 5:[5]
Multi line comments
If there are large number of lines you want to comment out then it will be better if you can make multi line comments rather than commenting out every line.
See this post by Rob van der Woude on comment blocks:
The batch language doesn't have comment blocks, though there are ways to accomplish the effect.
GOTO EndComment1 This line is comment. And so is this line. And this one... :EndComment1
You can use
GOTO
Label and :Label for making block comments.Or, If the comment block appears at the end of the batch file, you can write
EXIT
at end of code and then any number of comments for your understanding.@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...
Solution 6:[6]
Putting comments on the same line with commands: use & :: comment
color C & :: set red font color
echo IMPORTANT INFORMATION
color & :: reset the color to default
Explanation:
&
separates two commands, so in this case color C
is the first command and :: set red font color
is the second one.
Important:
This statement with comment looks intuitively correct:
goto error1 :: handling the error
but it is not a valid use of the comment. It works only because goto
ignores all arguments past the first one. The proof is easy, this goto
will not fail either:
goto error1 handling the error
But similar attempt
color 17 :: grey on blue
fails executing the command due to 4 arguments unknown to the color
command: ::
, grey
, on
, blue
.
It will only work as:
color 17 & :: grey on blue
So the ampersand is inevitable.
Solution 7:[7]
You can comment something out using ::
or REM
:
your commands here
:: commenttttttttttt
or
your commands here
REM commenttttttttttt
To do it on the same line as a command, you must add an ampersand:
your commands here & :: commenttttttttttt
or
your commands here & REM commenttttttttttt
Note:
- Using
::
in nested logic (IF-ELSE
,FOR
loops, etc...) will cause an error. In those cases, useREM
instead.
Solution 8:[8]
You can add comments to the end of a batch file with this syntax:
@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
Just make sure you never use a closing parentheses.
Attributions: Leo Guttirez Ramirez on https://www.robvanderwoude.com/comments.php
Solution 9:[9]
This is an old topic and I'd like to add my understanding here to expand the knowledge of this interesting topic.
The key difference between REM and :: is:
REM is a command itself, while :: is NOT.
We can treat :: as a token that as soon as CMD parser encounters the first non-blank space in a line is this :: token, it will just skip the whole line and read next line. That's why REM should be followed by at least a blank space to be able to function as a comment for the line, while :: does not need any blank space behind it.
That REM is a command itself can be best understood from the following FOR syntax
The basic FOR syntax is as follows
FOR %v in (set) DO <Command> [command param]
here <Command>
can be any valid command
So we can write the following valid command line as rem
is a command
FOR %i in (1,2,3) DO rem echo %i
However, we CANNOT write the following line as ::
is not a command
FOR %i in (1,2,3) DO :: echo %i
Solution 10:[10]
You can use ::
or rem
for comments.
When commenting, use ::
as it's 3 times faster. An example is shown here
Only if comments are in if
, use rem
, as the colons could make errors, because they are a label.
Solution 11:[11]
Commenting a line
For commenting line use REM or :: though ::
might fail inside brackets
within delayed expansion lines starting with !<delimiter>
will be ignored so this can be used for comments:
@echo off
setlocal enableDelayedExpansion
echo delayed expansion activated
!;delayed expansion commented line
echo end of the demonstration
Comment at the end of line
For comments at the end of line you can again use rem
and ::
combined with &
:
echo --- &:: comment (should not be the last line in the script)
echo --- &rem comment
Commenting at the end of file
As noting will be parsed after the exit
command you can use it to put comments at the end of the file:
@echo off
echo commands
exit /b
-------------------
commnts at the end
of the file
------------------
Inline comments
Expansion of not existing variables is replaced with nothing ,and as setting a variable with =
rather hard you can use this for inline comments:
@echo off
echo long command %= this is a comment =% with an inline comment
Multiline comments
For multiline comments GOTO
(for outside brackets) and REM
with conditional execution (for inside brackets) can be used. More details here:
@echo off
echo starting script
goto :end_comments
comented line
one more commented line
:end_comments
echo continue with the script
(
echo demonstration off
rem/||(
lines with
comments
)
echo multiline comment inside
echo brackets
)
And the same technique beautified with macros:
@echo off
::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"
::testing
echo not commented 1
%[:%
multi
line
comment outside of brackets
%:]%
echo not commented 2
%[:%
second multi
line
comment outside of brackets
%:]%
::GOTO macro cannot be used inside for
for %%a in (first second) do (
echo first not commented line of the %%a execution
%[%
multi line
comment
%]%
echo second not commented line of the %%a execution
)
Solution 12:[12]
I prefer to use:
- REM for comments
- &REM for inline comments
Example:
@echo off
set parameter1=%1%
REM test if the parameter 1 was received
if defined parameter1 echo The parameter 1 is %parameter1% &REM Display the parameter
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow