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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

::   commenttttttttttt
REM  commenttttttttttt

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

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

Ответ 3

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

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

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

EDIT: немного изменил пример, чтобы он содержал элементы, которые вы, по-видимому, ищете.

Ответ 4

:: вместо REM предпочтительно использовалось в те дни, когда компьютеры были не очень быстрыми. Строка REM'ed считывается, а затем запускается.:: 'ed line игнорируются полностью. Это может ускорить ваш код в "старые дни". Еще больше после 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

Ответ 5

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

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

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

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

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

Вы можете использовать GOTO Label и: 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...

Ответ 6

Размещение комментариев в одной строке с командами: используйте & :: 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

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

Ответ 7

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

your commands here
:: commenttttttttttt

или же

your commands here
REM  commenttttttttttt

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

your commands here      & ::  commenttttttttttt

или же

your commands here      & REM  commenttttttttttt

Замечания:

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

Ответ 8

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

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

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

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

То, что 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