Как «закомментировать» (добавить комментарий) в пакете / cmd?


883

У меня есть пакетный файл, который запускает несколько сценариев Python, которые вносят изменения в таблицу.

  1. Я хочу, чтобы пользователи закомментировали 1-2 сценария Python, которые они не хотят запускать, вместо того, чтобы удалять их из командного файла (чтобы следующий пользователь знал, что эти сценарии существуют как опции!)

  2. Я также хочу добавить комментарии, чтобы привлечь их внимание конкретно к переменным, которые им необходимо обновить в пакетном файле, прежде чем они его запустят. Я вижу, что я могу использовать REM. Но похоже, что это больше для обновления пользователя с прогрессом после его запуска.

Есть ли синтаксис для более подходящего добавления комментария?


6
Смотрите также отличные ответы здесь stackoverflow.com/q/12407800/1011025
ndemou

2
Вы можете использовать Rem Sthкоманду или Использовать этот Марк::: Sth
scientist_7

Ответы:


881

Команда remдействительно для комментариев. По сути, он не обновляет никого после запуска скрипта. Некоторые авторы сценариев могут использовать его вместо этого echo, потому что по умолчанию пакетный интерпретатор распечатывает каждую команду до ее обработки. Поскольку remкоманды ничего не делают, их можно печатать без побочных эффектов. Чтобы избежать печати команды @, запустите ее с префиксом или, чтобы применить этот параметр во всей программе @echo off. (Это echo offнужно для того , чтобы не печатать дальнейшие команды; @нужно избегать печати этой команды до вступления в силу настройки эха.)

Итак, в вашем командном файле вы можете использовать это:

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

405
Вы также можете использовать две двоеточия "::". Это один из двух способов добавления замечаний в пакетный файл без отображения или выполнения этой строки при запуске пакетного файла. В отличие от REM эта строка не будет отображаться независимо от того, находится ли ECHO off в командном файле.
Brent81

12
@ Brent81 Мне кажется, это должен быть правильный ответ. При использовании подсветки синтаксиса команда REM фактически не выделяет текст как «закомментированный».
Автомат

17
Двойное двоеточие является «недопустимым ярлыком»; Вот статья, которая объясняет это, и почему его производительность может быть лучше, чем у REM (особенно на дискетах!), и она не будет работать в блоках кода с отступом (только для первого символа): robvanderwoude.com/comments.php
Майкл Паукуонис

4
Интересно. Я хотя REM был «вся линия комментарий» и двойное двоеточие был «встроенный комментарий», какREM This whole line is a comment @echo off :: This comment is inline
Richard Smith

@Alhadis, Perl-скрипт Configure написан в оболочке Bourne, а не в пакетном режиме Windows, так как это здесь уместно? Кроме того, команда двоеточия, являющаяся допустимым синтаксисом Борна, не является «побочным эффектом бонуса»; именно поэтому он используется в этом сценарии Борна . Он используется в пользу #комментариев, потому что #, очевидно, он может быть недопустимым указателем комментариев во всех оболочках, которые должен поддерживать Configure; см. строку 3.
Роб Кеннеди

956

Используйте ::илиREM

::   commenttttttttttt
REM  commenttttttttttt

НО (как отметили люди):

  • Если вы используете inline, вам нужно добавить &символ:
    your commands here & :: commenttttttttttt
  • Внутри вложенной логики ( IF/ELSE, FORпетли и т.д. ...) использованиеREM , потому что ::дает ошибку.
  • :: может потерпеть неудачу в течение setlocal ENABLEDELAYEDEXPANSION

79
Двойное двоеточие :: Это самый чистый комментарий .bat. И это может быть использовано в начале или в середине строки!
ATSiem

10
Не работает для меня, когда сделано в линию, как это. cd "C:\Folder" ::this throws a syntax error
Шон Роуэн

3
Также терпит неудачу git add :: blah this is not a commentс "fatal: pathspec 'blah' не соответствует ни одному файлу"
Боб Стейн

19
Для комментария в той же строке, что и в примере, необходимо добавить &код и комментарий ::. Чтобы проиллюстрировать это, откройте командную строку cmd и запустите ее, dir ::blahкоторая не перечисляет содержимое .и не сравнивает ее dir & ::blah, что делает
Rado

19
Предупреждение, использование ::сценариев ошибок с setlocal ENABLEDELAYEDEXPANSIONиfor
Azevedo

50

Нет, простые старые командные файлы используют REMв качестве комментария. ECHOэто команда, которая печатает что-то на экране.

Чтобы «закомментировать» разделы файла, вы можете использовать GOTO. Пример всех этих команд / методов:

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

Что я могу сказать? пакетные файлы - это пережиток давних времен, они неуклюжие и уродливые.

Вы можете прочитать больше на этом сайте .

РЕДАКТИРОВАТЬ: немного изменил пример, чтобы он содержал элементы, которые вы, очевидно, ищете.


31

:: вместо REM предпочтительно использовался в те дни, когда компьютеры работали не очень быстро. REM-строки читаются, а затем обрабатываются. Строка :: игнорируется полностью. Это может ускорить ваш код в «старые времена». Еще больше после REM вам нужен пробел, после :: вы не делаете.

И, как сказано в первом комментарии: вы можете добавить информацию в любую строку, в которой вы чувствуете необходимость

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

Что касается пропуска деталей. Помещение REM перед каждой строкой может занять довольно много времени. Как уже упоминалось, использование GOTO для пропуска частей - это простой способ пропустить большие куски кода. Обязательно установите: LABEL в той точке, в которой вы хотите, чтобы код продолжался.

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
Как можно игнорировать строку с двоеточием, не читая? Разве переводчик не должен сначала прочитать строку, прежде чем признать ее строкой с двойным двоеточием?
Роб Кеннеди

2
Когда я читаю ответ, @RobKennedy ничего не читает после ::, где все после REM читается.
Джеймс Дженкинс

5
Если интерпретатор команд прекратит чтение , @James, он больше никогда не выполнит файл. Очевидно, что необходимо продолжить чтение, чтобы узнать, где заканчивается комментарий и где начинается следующая строка файла. Он должен сделать это с ::и в remравной степени.
Роб Кеннеди

2
@RobKennedy, я также подумал, что подразумевается, что это относится только к строке, на которой была включена команда.
Джеймс Дженкинс

7
@RobKennedy он читает, но не анализирует (или не обрабатывает) то, что читает, он просто пропускает до следующего, \nа затем снова начинает анализировать [цитата нужна]
xDaizu

25

Многострочные комментарии

Если есть большое количество строк, которые вы хотите закомментировать, то было бы лучше, если бы вы могли делать многострочные комментарии, а не комментировать каждую строку.

Смотрите этот пост Роба ван дер Вуде в комментариях :

В пакетном языке нет блоков комментариев, хотя есть способы добиться эффекта.

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

Вы можете использовать GOTOLabel и: Label для создания блочных комментариев.

Или, если блок комментариев появляется в конце пакетного файла, вы можете написать EXITв конце кода, а затем любое количество комментариев для вашего понимания.

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

это часто используется в гибридных пакетных сценариях и сценариях VBS / JS, хотя они используются, если ifвместо goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv

13

Размещение комментариев в одной строке с командами: используйте & :: comment

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

Объяснение:

&разделяет две команды , поэтому в данном случае color Cэто первая команда и :: set red font colorвторая.


Важный:

Это утверждение с комментарием выглядит интуитивно правильным:

goto error1         :: handling the error

но это не допустимое использование комментария. Это работает только потому, что gotoигнорирует все аргументы после первого. Доказательство легко, это gotoтакже не подведет:

goto error1 handling the error

Но похожая попытка

color 17            :: grey on blue

не удается выполнить команду из - за 4 аргументов неизвестной к colorкоманде: ::, grey, on,blue .

Это будет работать только как:

color 17     &      :: grey on blue

Так что амперсанд неизбежен.


Из других ответов кажется, что амперсанд не нужен?
RoG

3
@Snaptastic - другие ответы на самом деле неверны в этом пункте, см. Мое недавнее редактирование.
Miroxlav

Кажется, это правильный путь; Это даже выделяется как комментарий в моей IDE.
baburao

5

Вы можете что-то закомментировать, используя ::или REM:

your commands here
:: commenttttttttttt

или

your commands here
REM  commenttttttttttt

 

Чтобы сделать это в той же строке, что и команда, необходимо добавить амперсанд:

your commands here      & ::  commenttttttttttt

или

your commands here      & REM  commenttttttttttt

 

Замечания:

  • Использование :: во вложенной логике ( IF-ELSE, FORциклов и т. Д.) Вызовет ошибку. В этих случаях используйте REMвместо этого.

Это основано на ответе Т. Тодуа. Я чувствовал, что их ответ был хорошим, но пропустил некоторые важные детали, но они откатили мою правку, поэтому я превращаю свою ревизию в ее собственный ответ.
Pikamander2

Pikamander2, ваша ревизия (также указанная пользователем @Rado была объединена в ответе в то время, и спасибо за это, просто я предпочел другой стиль для ответа и использовал другой стиль.
T.Todua

1

Это старая тема, и я хотел бы добавить свое понимание здесь, чтобы расширить знания этой интересной темы.

Основное различие между REM и :::

REM сама команда, а :: НЕ.

Мы можем рассматривать :: как токен, который, как только синтаксический анализатор CMD обнаружит первый непустой пробел в строке, будет следующим :: токеном, он просто пропустит всю строку и прочитает следующую строку. Вот почему за REM должен следовать хотя бы пробел, чтобы он мог функционировать в качестве комментария для строки, в то время как :: не нужно никакого пробела позади него.

Это РЗМ команда сама по себе может быть лучше понято из нижеследующего FOR синтаксиса

Основной синтаксис FOR следующий

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

здесь <Command>может быть любая действительная команда. Таким образом, мы можем написать следующую действительную командную строку как remкоманду

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

Тем не менее, мы не можем написать следующую строку, так как ::это не команда

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

3
технически, ::это (недействительный) ярлык (который объясняет его поведение), и поэтому его не следует использовать (хотя он все еще довольно распространен)
Стефан,

1

Вы можете добавить комментарии в конец командного файла с этим синтаксисом:

@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

Просто убедитесь, что вы никогда не используете закрывающие скобки.

Атрибуты: Лео Гуттирез Рамирес на https://www.robvanderwoude.com/comments.php

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.