Комментирование нескольких строк в пакетном файле DOS - PullRequest
87 голосов
/ 16 декабря 2011

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

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

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

Ответы [ 6 ]

157 голосов
/ 16 декабря 2011

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

goto comment
...skip this...
:comment
110 голосов
/ 12 июля 2012

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

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

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

12 голосов
/ 15 февраля 2015
break||(
 code that cannot contain non paired closing bracket
)

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

Обновление

Обновление в ответе dbenham дало мне несколько идей.Во-первых, есть два разных случая, когда нам могут понадобиться многострочные комментарии - в контексте скобок, где 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 стилями (< не может использоваться, потому что перенаправление с более высоким prio. * не может использоваться из-за %*):

@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
)

To emphase это комментарий (хотя он и не такой короткий):

@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
)
10 голосов
/ 16 декабря 2011

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

if 1==0 (
...
)

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

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

Вот косметическое улучшение решения pdub GOTO . Я определяю простую переменную среды «макрос», которая делает синтаксис комментариев 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
)
0 голосов
/ 16 декабря 2011

@ Джеб

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

Нет, попробуйте это:

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

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

   echo hello Tunisia

  pause

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

извините, я отвечаю на вопрос по-френшски:

(перенаправление пар. 3> Специальная автомобильная защита, на устройстве для захвата потока потока 2> Оценка на трансформаторе и постоянном напряжении, информация о состоянии потока 3> ceci va Вы не можете найти ничего хорошего, что может произойти в настоящий момент. Вы можете быть уверены, что у вас не возникнет никаких трудностей. консоль ..)

0 голосов
/ 16 декабря 2011

попробуйте это:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause
...