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


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

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

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

6 75

6 ответов:

можно использовать goto пропустить код.

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

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

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

повторите шаги для раскомментирования

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

if 1==0 (
...
)

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

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

здесь это косметическое повышение до 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.||(
   remarks
   go here
)

rem^ ||(
   The space after the caret
   is critical
)
break||(
 code that cannot contain non paired closing bracket
)

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

обновление

обновление dbenham это ответ дал мне некоторые идеи. Во-первых-есть два разных случая, когда нам могут понадобиться многострочные комментарии - в контексте скобки, где GOTO нельзя использовать и вне его. Внутри контекста скобок мы можем использовать другие скобки, если есть условие, которое предотвращает выполнение кода.Хотя код thede все равно будет разбираться и некоторые синтаксические ошибки будут обнаружены (FOR,IF, неправильно закрытые скобки, неправильное расширение параметра..). поэтому, если это возможно, лучше использовать GOTO.

хотя это не возможно, чтобы создать макрос/переменная, используемая в качестве метки-но можно использовать макросы для комментариев скобок.Еще два трюка можно использовать сделать Гото комментарии более симметричные и более приятные (по крайней мере для меня). Для этого я использую два трюка -1) вы можете поместить один символ перед этикеткой и Гото все еще сможет чтобы найти его (я понятия не имею, почему это this.My guues он ищет диск). 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
)

до акцент вот такой комментарий (думал он не такой уж и короткий):

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

@jeb

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

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

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

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

   echo hello Tunisia

  pause

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

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

( Ла-перенаправление пар 3> есть профиль spécial автомобиля Элль КР О ва л'utiliser залить рекордер из ЛЕ-пото-де erreurs 2> есть на Ва ле трансформаторов в организации потока персистирующая à л аде де 3> Кэси ва nous permettre d'avoir une gestion des erreur pour tout notre Environment 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.. )

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

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause