Як "коментувати" (додавати коментар) у пакеті / cmd?


881

У мене є пакетний файл, який виконує кілька сценаріїв python, які вносять модифікації таблиці.

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

  2. Я також хочу додати коментарі, щоб звернути їх увагу конкретно на змінні, які потрібно оновити у файлі Batch, перш ніж вони запускаються. Я бачу, що можу використовувати REM. Але схоже, що це більше для оновлення користувача прогресом після його запуску.

Чи є синтаксис для більш доцільного додавання коментаря?


6
Дивіться також відмінні відповіді тут stackoverflow.com/q/12407800/1011025
ndemou

2
Ви можете використовувати Rem Sthкоманду або використовувати цю :: Sth
scientist_7

Відповіді:


879

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 у пакетному файлі.
Brent81

12
@ Brent81 Я вважаю, що це має бути правильна відповідь. При використанні підсвічування синтаксису команда REM насправді не виділяє текст як "коментований".
Automatico

17
Подвійний двокрапка - це "недійсна мітка"; ось стаття, яка пояснює це, і чому його ефективність може бути кращою, ніж REM (особливо на дискетах!), і вона не працюватиме в блоках з відступом коду (лише на першому символі): robvanderwoude.com/comments.php
Michael Paulukonis

4
Цікаво. Я хоч REM був "коментарем до цілої лінії", а подвійна двокрапка - "вбудований коментар", як-отREM This whole line is a comment @echo off :: This comment is inline
Річард Сміт

@Alhadis, скрипт Налаштування Perl написаний у оболонці Bourne, а не в пакеті Windows, тож як це доречно тут? Крім того, команда двокрапки, чинна синтаксис Бурна, не є "бонусним побічним ефектом"; саме тому він використовується в тому сценарії Борна . Він використовується на користь #коментарів, оскільки #, очевидно, може бути неприйнятним позначенням коментарів у всіх оболонках Налаштування призначене для підтримки; див. рядок 3.
Роб Кеннеді

955

Використовуйте ::абоREM

::   commenttttttttttt
REM  commenttttttttttt

АЛЕ (як зазначали люди):

  • Якщо ви використовуєте вбудований текст, вам потрібно додати &символ:
    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 "не відповідав жодним файлам"
Bob Stein

19
Для коментаря в тому ж рядку, що ілюструє приклад, вам потрібно додати &між кодом і коментарем ::. Для ілюстрації відкрийте підказку і запустіть cmd, у dir ::blahякому не перелічено вміст .та порівняння dir & ::blah, що це робить
Радо

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

Що я можу сказати? Пакетні файли - це пережиток давно минулих часів, вони незграбні та некрасиві.

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

EDIT: трохи змінив приклад, щоб він містив елементи, які ви, очевидно, шукаєте.


31

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

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.
бабурао

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 повинен дотримуватися принаймні порожнього простору, щоб він міг функціонувати як коментар для рядка, в той час як :: не потребує порожнього простору за ним.

Що 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
технічно ::- це (недійсна) мітка (що пояснює її поведінку), і тому її не слід використовувати (хоча це все ще досить часто)
Stephan

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.