Коментування декількох рядків у командному файлі DOS


98

Я написав величезний пакетний файл MS DOS. Щоб протестувати цей пакетний файл, мені потрібно виконати лише деякі рядки і хочу приховати / залишити коментар, що залишився.

У мене є деякі існуючі рядки коментарів, починаючи з, ::отже, я більше не можу їх використовувати, ::оскільки вони будуть шифрувати всі коментарі.

Як я можу вирішити цю проблему?

Відповіді:


183

Ви можете використовувати a, gotoщоб пропустити код.

goto comment
...skip this...
:comment

11
+1: Смішно використовувати для цього "goto" І це працює!
rap-2-h

1
Я думаю, що дивно, що в командному рядку немає справжнього визначення коментаря, я просто не можу приймати REMрядки як рядки коментарів, це робить вихід неясним
mkb

125

Якщо ви хочете додати REM на початку кожного рядка, а не використовувати GOTO, ви можете використовувати Notepad ++, щоб зробити це легко, виконавши наступні дії:

  1. Виділіть блок рядків
  2. натисніть Ctrl-Q

Повторіть кроки, щоб розкоментувати


6
Приємна порада. робить його набагато чистішим.
Venom

1
Ого, не знав, блокнот ++ має таку приємну функцію! Насправді дуже скучив, бо я звик до `Ctrl + 7 'в Eclipse. Проголосували до 42 ;)
Денні Ло

1
А як щодо розкоментувати Там є будь-який ярлик, щоб розкоментувати весь блок.
Bhaskar Singh

2
@BhaskarSingh Що стосується Notepad ++ 7.5.6, ви можете просто виділити вже прокоментований текст; зробіть "Ctrl + Q", і це прокоментує
CreativiTimothy

Якщо ваш мозок часто слабкий , як у мене , щоб пам'ятати Ctrl-Q, натисніть на Notepad++: Edit -> Comment/Uncomment.
Тимо,

13
break||(
 code that cannot contain non paired closing bracket
)

Хоча gotoрішення є хорошим варіантом, воно не буде працювати в дужках (включаючи команди FOR та IF). Але це буде. Хоча ви повинні бути обережними щодо закриття дужок та неприпустимого синтаксису команд FORі IFкоманд, оскільки вони будуть проаналізовані.

Оновлення

Оновлення у відповіді dbenham дало мені кілька ідей. По-перше - є два різні випадки, коли нам потрібні багаторядкові коментарі - в дужці, коли GOTO не може бути використаний і поза ним. Усередині дужок контексту ми можемо використовувати інші дужки , якщо є умова , яке запобігає код буде executed.Though код thede по- , як і раніше буде проаналізований і будуть виявлені деякі синтаксичні помилки ( FOR, IF, неправильно закриті дужки, неправильне розширення параметра ..). Таким чином , якщо можливо, краще скористатися GOTO.

Хоча створити макрос / змінну, що використовується як мітка, неможливо - але можна використовувати макроси для коментарів дужок. Ще можна використовувати дві хитрощі, щоб зробити коментарі GOTO більш симетричними та приємнішими (принаймні для мене). Для цього я скористаюся двома прийомами - 1) ви можете поставити один символ перед міткою, і goto все одно зможе його знайти (я не маю уявлення, чому це. Мої думки, він шукає диск). 2) ви можете поставити єдине : в кінці імені змінної, і функція заміни / підрядки не буде спрацьовувати (навіть при включених розширеннях). Що в поєднанні з макросами для коментарів у дужках може змусити обидва випадки виглядати майже однаково.

Ось ось приклади (у тому порядку, який мені найбільше подобається):

З прямокутними дужками :

@echo off

::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"

::testing
echo not commented 1

%[:%
  multi 
  line
  comment outside of brackets
%:]%

echo not commented 2

%[:%
  second multi 
  line
  comment outside of brackets
%:]%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %[%
        multi line
        comment
    %]%
    echo second not commented line of the %%a execution
)

З фігурними дужками :

@echo off

::GOTO comment macro
set "{:=goto :}%%"
::brackets comment macros
set "{=rem/||(" & set "}=)"

::testing
echo not commented 1

%{:%
  multi 
  line
  comment outside of brackets
%:}%

echo not commented 2

%{:%
  second multi 
  line
  comment outside of brackets
%:}%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %{%
        multi line
        comment
    %}%
    echo second not commented line of the %%a execution
)

З дужками :

@echo off

::GOTO comment macro
set "(:=goto :)%%"
::brackets comment macros
set "(=rem/||(" & set ")=)"

::testing
echo not commented 1

%(:%
  multi 
  line
  comment outside of brackets
%:)%

echo not commented 2

%(:%
  second multi 
  line
  comment outside of brackets
%:)%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %(%
        multi line
        comment
    %)%
    echo second not commented line of the %%a execution
)

Суміш між стилями powerhell та C ( <не може бути використана, оскільки перенаправлення має вищий пріоритет. *Неможливо використовувати через %*):

@echo off

::GOTO comment macro
set "/#:=goto :#/%%"
::brackets comment macros
set "/#=rem/||(" & set "#/=)"

::testing
echo not commented 1

%/#:%
  multi 
  line
  comment outside of brackets
%:#/%

echo not commented 2

%/#:%
  second multi 
  line
  comment outside of brackets
%:#/%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %/#%
        multi line
        comment
    %#/%
    echo second not commented line of the %%a execution
)

Щоб підкреслити, що це коментар (думав, що він не такий короткий):

@echo off

::GOTO comment macro
set "REM{:=goto :}REM%%"
::brackets comment macros
set "REM{=rem/||(" & set "}REM=)"

::testing
echo not commented 1

%REM{:%
  multi 
  line
  comment outside of brackets
%:}REM%

echo not commented 2

%REM{:%
  second multi 
  line
  comment outside of brackets
%:}REM%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %REM{%
        multi line
        comment
    %}REM%
    echo second not commented line of the %%a execution
)

1
Ви можете використовувати rem.||(або rem^ (замість цього. Намір трохи чіткіший. Дивіться мою оновлену відповідь.
dbenham

@dbenham - так, з rem це коротше.
npocmaka

1
О, квадратні і фігурні дужки форми сексуальні. Якби я писав код тільки для себе, я міг би його використовувати. Але я думаю, що середній користувач побачив би це і сказав WTF.
dbenham

@dbenham - можливо, ти маєш рацію. Я можу також включити %rem:%+ %:rem%форму, щоб зробити її більш очевидною, хоча вона втратить чарівність. Або лише косою рисою, щоб бути ближче до стилю С ...
npocmaka

1
@npocmaka Це чудово! Я щойно дізнався купу тонкощів сценарію партії, розбираючись, що ти робив. З усіх відомих мені методів блокування коментарів (для партії) цей, здається, найбільш надійний і розумний. +1 за поєднання хак і стилю
Jared Gotte

10

Інший варіант - укласти непотрібні рядки в блок IF, який ніколи не може бути правдивим

if 1==0 (
...
)

Звичайно нічого в блоці if не буде виконано, але він буде проаналізований. Отже, у вас не може бути жодного невірного синтаксису. Також коментар не може містити, )якщо його не уникнути або процитувати. З цих причин прийняте рішення GOTO є більш надійним. (Рішення GOTO також може бути швидшим)

Оновлення 2017-09-19

Ось косметичне вдосконалення рішення GOTO pdub . Я визначаю просту змінну середовища "макрос", яка робить синтаксис коментарів GOTO трохи кращим для самостійного документування. Хоча, як правило, рекомендується: мітки унікальні в пакетному сценарії, дійсно добре вбудовувати кілька подібних коментарів в один і той же пакетний сценарій.

@echo off
setlocal

set "beginComment=goto :endComment"

%beginComment%
Multi-line comment 1
goes here
:endComment

echo This code executes

%beginComment%
Multi-line comment 2
goes here
:endComment

echo Done

Або ви можете використовувати один із цих варіантів рішення npocmaka . Використання REM замість BREAK робить намір трохи зрозумілішим.

rem.||(
   remarks
   go here
)

rem^ ||(
   The space after the caret
   is critical
)

1

Просто хочу зазначити, що рішення GDO pdub не є повністю правильним у випадку: мітка коментаря з’являється кілька разів. Я змінюю код із цього питання як приклад.

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

Вихід буде

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

Команда ECHO HERE AT TD_NEXT В ПЕРШОМ БЛОКУ пропущена.


0

@jeb

І після використання цього, stderr здається недоступним

Ні, спробуйте це:

@echo off 2>Nul 3>Nul 4>Nul

   ben ali  
   mubarak 2>&1
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

Але чому це працює?

вибачте, я відповідаю на питання по-френш:

(la predirection par 3> est spécial car elle persiste; on l'utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flux persistent à l'ade de 3> ceci va nous permettre d'avoir und gestion des erreur pour tout notre environement de script..par la suite si on veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)


1
Я не можу читати французькою мовою, але це не схоже на те, що ти адресуєшся, чому потік 2 (stderr) продовжує вимикатись після закінчення початкового перенаправлення. У мене є працездатна теорія та тестові випадки в двох публікаціях поспіль за адресою dostips.com/forum/viewtopic.php?p=14612#p14612 .
dbenham

(Перенаправлення на 3> є особливим, оскільки воно зберігається, ми будемо використовувати його для фіксації потоку помилок 2> це перетворить його на постійний потік до аде 3> це дозволить нам мати помилку управління для будь-якого з наших сценарій оточення .. тоді, якщо ви хочете відновити потік 'stderr', ми повинні зробити ще одну переадресацію ручки 2> для обробки a>, що не що інше, як консоль ..)
user96403

-1

спробуйте це:

   @echo off 2>Nul 3>Nul 4>Nul

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1, але чому це працює? І після використання цього, stderr здається недоступним
jeb

1
-1, Це "працює", тому що echo 2> Nul перенаправляє стандартний потік помилок на NUL, поховаючи його (3> Nul, 4> Nul перенаправляють допоміжні потоки без реальної причини). Це не коментує рядки, а лише перешкоджає показу повідомлень про помилки. Отже, все, що можна інтерпретувати як командні рядки, все одно буде виконуватися.
pdubs

3
Коментар pdubs частково правильний тим, що команди все ще виконуються (а помилкові, тому що недійсні). Але дійсні команди виконуватимуться безвідмовно. Отже, це не найкраще рішення для коментування рядків коду. Пояснення, чому потік 2 (stderr) "назавжди" вимкнено, є неправильним.
dbenham

3
У мене є теорія щодо того, як перенаправлення працює в пакеті Windows, і це пояснює, чому stderr у цій відповіді "назавжди" відключений. Теорія та тести є у двох послідовних публікаціях на doseps.com/forum/viewtopic.php?p=14612#p14612
dbenham
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.