Вопрос по comments, commenting, batch-file, cmd, comment-conventions – Как «закомментировать» (добавить комментарий) в пакете / cmd?

723

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

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.

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

Смотрите также отличные ответы здесьstackoverflow.com/q/12407800/1011025 ndemou
@MichaelFreidgeim этот вопрос кажется старше, чем этот дублирующий вопрос :) T.Todua

Ваш Ответ

8   ответов
42

Нет, обычные старые командные файлы используют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

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

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

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

728

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

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

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py
Интересно. Я думал, что REM был «комментарием к целой строке»; и двойное двоеточие было «встроенным комментарием», какREM This whole line is a comment @echo off :: This comment is inline
@ Brent81 Мне кажется, это должен быть правильный ответ. При использовании подсветки синтаксиса команда REM фактически не выделяет текст как «закомментированный».
Вы также можете использовать два двоеточия & quot; :: & quot ;. Это один из двух способов добавления примечаний в пакетный файл без отображения или выполнения этой строки при запуске пакетного файла. В отличие от REM эта строка не будет отображаться независимо от того, находится ли ECHO off в командном файле.
Двойное двоеточие - это «недопустимая метка»; вот статья, которая объясняет это и почему она может быть лучше, чем REM (особенно на дискетах!), и она не будет работать в блоках кода с отступом (только на первом символе):robvanderwoude.com/comments.php
Собственный PerlConfigure сценарий использует:  чтобы отметить встроенные комментарии (обратите внимание на пробел), и его поддержка простирается вплоть до древних систем DOS / VMS. Более того,:  имеет бонусный побочный эффект бытияvalid Bourne-shell syntaxс условием, что отступы или метасимволы не используются (технически,: приравнивается кtrue для оболочек типа Борна, так что это неquite такой же как#Тип комментария ...)
12

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так что в этом случаеcolor C это первая команда и:: set red font color это второй.


Important:

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

goto error1         :: handling the error

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

goto error1 handling the error

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

color 17            :: grey on blue

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

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

color 17     &      :: grey on blue

So the ampersand is inevitable.

Из других ответов кажется, что амперсанд не нужен?
Это, кажется, правильный путь; Это даже выделяется как комментарий в моей IDE.
@Snaptastic & # x2013; Другие ответы на самом деле неверны в этом пункте, смотрите мое недавнее редактирование.
28

:: вместо 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
@RobKennedy, когда я читаю ответ, он ничего не читает после ::, где все после REM читается.
Если командный интерпретаторstops [email protected], тогда он никогда не выполнит файл. Очевидно, что необходимо продолжить чтение, чтобы узнать, где заканчивается комментарий и где начинается следующая строка файла. Это должно сделать это с:: а такжеrem в равной степени.
@RobKennedy это делаетread но это не такparse (или обработать) то, что он читает, он просто пропускает до следующего\n и затем снова начинает синтаксический анализ
Как можно игнорировать строку с двоеточием, не читая? Должен ли интерпретатор сначала прочитать строку, прежде чем распознать ее как строку с двойным двоеточием?
@RobKennedy, я также подумал, что подразумевается, что это относится только к той строке, на которой была включена команда.
22

Multi line comments

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

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

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

Ты можешь использоватьGOTO Метка и: Метка для создания блочных комментариев.

Или, если блок комментария появляется в конце пакетного файла, вы можете написать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...

Источник комментариев

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

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

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

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

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

То, что REM - это сама команда, лучше всего понять из следующегоЗА синтаксис

Основной синтаксис 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
технически,:: является (недействительным) ярлыком (который объясняет его поведение) и поэтому не должен использоваться (хотя он все еще довольно распространен)
2

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

your commands here
:: commenttttttttttt

или же

your commands here
REM  commenttttttttttt

& # XA0;

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

your commands here      & ::  commenttttttttttt

или же

your commands here      & REM  commenttttttttttt

& # XA0;

Note:

  • Using :: in nested logic (IF-ELSE, FOR loops, etc...) will cause an error. In those cases, use REM instead.
Это основано на ответе T.Todua. Я чувствовал, что их ответ был хорошим, но пропустил некоторые важные детали, но они откатили мое редактирование, поэтому я превратил мою ревизию в ее собственный ответ.
Pikamander2, ваша ревизия (также указанная пользователем@Rado  был объединен в ответе в то время, и спасибо за это, просто я предпочел другой стиль для ответа и использовал другой стиль.
793

:: or REM

::   commenttttttttttt
REM  commenttttttttttt

BUT (as people noted):

  • If you use inline, you need to add & character:
    your commands here & :: commenttttttttttt
  • Inside nested logic (IF/ELSE, FOR loops, etc...) use REM because :: gives an error.
  • :: may fail within setlocal ENABLEDELAYEDEXPANSION
Не работало для меня, когда выполнялось встроенным, как это.cd "C:\Folder" ::this throws a syntax error
Для комментария к той же строке, что и в примере, необходимо добавить& между кодом и комментарием::, Чтобы проиллюстрировать это, откройте командную строку cmd и запуститеdir ::blah который не перечисляет содержимое. и сравнить сdir & ::blahчто делает
Это решение лучше, поскольку оно повышает читабельность.
Предупреждение, используя:: будет ошибка скриптов сsetlocal ENABLEDELAYEDEXPANSION а такжеfor
Двойное двоеточие :: Это самый чистый комментарий .bat. И это может быть использовано в начале или в середине строки!

Похожие вопросы