Комментирование нескольких строк в пакетном файле DOS

Я написал огромный файл MS DOS Batch. Чтобы протестировать этот командный файл, мне нужно выполнить только некоторые строки и вы хотите скрывать/комментировать их.

У меня есть некоторые существующие строки комментариев, начиная с:: следовательно, я больше не могу использовать::, поскольку он будет скремблировать все комментарии.

Любая помощь в этом отношении будет оценена по достоинству. Заранее спасибо, Джей

Ответ 1

Вы можете использовать goto для пропуска кода.

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

Ответ 2

Если вы хотите добавить REM в начале каждой строки вместо использования GOTO, вы можете использовать Notepad ++, чтобы сделать это легко, выполнив следующие шаги:

  • Выберите блок строк
  • нажмите Ctrl-Q

Повторите шаги, чтобы раскомментировать

Ответ 3

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

Хотя решение goto является хорошим вариантом, оно не будет работать в скобках (включая команды FOR и IF). Но это будет, Хотя вы должны быть осторожны относительно закрытия скобок и недействительного синтаксиса для команд FOR и IF, потому что они будут проанализированы.

Обновление

Обновление в ответе dbenham's дало мне несколько идей. Во-первых - есть два разных случая, когда нам могут понадобиться многострочные комментарии - в контексте скобок, где GOTO нельзя использовать и вне его. Внутри скобок контекст мы можем использовать другие скобки, если есть условие, которое предотвращает выполнение кода. Хотя код 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
)

Смесь между powershell и стилями 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
)

Ответ 4

Другой вариант заключается в том, чтобы заключить нежелательные строки в блок IF, который никогда не может быть правдой

if 1==0 (
...
)

Конечно, ничто внутри блока if не будет выполнено, но оно будет проанализировано. Таким образом, вы не можете иметь какой-либо недопустимый синтаксис внутри. Кроме того, комментарий не может содержать ), если он не экранирован или не указан. По этим причинам принятое решение GOTO является более надежным. (Решение GOTO также может быть быстрее)

Обновление 2017-09-19

Вот косметическое усовершенствование pdub GOTO solution. Я определяю простую переменную окружения "macro", которая делает синтаксис комментариев GOTO немного лучше самодокументирующимся. Хотя обычно рекомендуется, чтобы: ярлыки были уникальными в пакете script, вполне нормально вставлять несколько комментариев, подобных этому, в пределах той же партии script.

@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 solution. Использование REM вместо BREAK делает намерение более понятным.

rem.||(
   remarks
   go here
)

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

Ответ 5

Просто хочу отметить, что решение pdub GOTO не совсем правильно в случае: метка комментария появляется несколько раз. Я изменяю код из этого вопроса в качестве примера.

@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 в первом блоке пропускается.

Ответ 6

@jeb

И после использования stderr кажется недоступным

Нет, попробуйте следующее:

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

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

   echo hello Tunisia

  pause

Но почему это работает?

Извините, я отвечу на вопрос во frensh:

(la redirection par 3 > est spécial car elle persiste, on va l'utiliser pour capturer le flux des erreurs 2 > est on va le transformer en un flux persistant à l'ade de 3 > ceci va nous permettre d'avoir une 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..)

Ответ 7

попробуйте следующее:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause