Вопрос по comments, commenting, batch-file, cmd, comment-conventions – Как «закомментировать» (добавить комментарий) в пакете / cmd?
У меня есть пакетный файл, который запускает несколько сценариев 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.
Есть ли синтаксис для более подходящего добавления комментария?
Нет, обычные старые командные файлы используют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
Что я могу сказать? пакетные файлы - это пережиток давних времен, они неуклюжие и уродливые.
Вы можете прочитать большена этом сайте.
РЕДАКТИРОВАТЬ: немного изменил пример, чтобы он содержал элементы, которые вы, очевидно, ищете.
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
Configure
сценарий использует:
чтобы отметить встроенные комментарии (обратите внимание на пробел), и его поддержка простирается вплоть до древних систем DOS / VMS. Более того,:
имеет бонусный побочный эффект бытияvalid Bourne-shell syntaxс условием, что отступы или метасимволы не используются (технически,:
приравнивается кtrue
для оболочек типа Борна, так что это неquite такой же как#
Тип комментария ...)
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.
:: вместо 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
::
а такжеrem
в равной степени.
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...
if
вместоgoto
stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
Это старая тема, и я хотел бы добавить свое понимание здесь, чтобы расширить знания по этой интересной теме.
Основное различие между 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
Вы можете что-то комментировать, используя::
или же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, useREM
instead.
::
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...) useREM
because::
gives an error. ::
may fail withinsetlocal ENABLEDELAYEDEXPANSION