Ответ 1
Вы можете использовать goto
для пропуска кода.
goto comment
...skip this...
:comment
Я написал огромный файл MS DOS Batch. Чтобы протестировать этот командный файл, мне нужно выполнить только некоторые строки и вы хотите скрывать/комментировать их.
У меня есть некоторые существующие строки комментариев, начиная с:: следовательно, я больше не могу использовать::, поскольку он будет скремблировать все комментарии.
Любая помощь в этом отношении будет оценена по достоинству. Заранее спасибо, Джей
Вы можете использовать goto
для пропуска кода.
goto comment
...skip this...
:comment
Если вы хотите добавить REM в начале каждой строки вместо использования GOTO, вы можете использовать Notepad ++, чтобы сделать это легко, выполнив следующие шаги:
Повторите шаги, чтобы раскомментировать
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
)
Другой вариант заключается в том, чтобы заключить нежелательные строки в блок 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
)
Просто хочу отметить, что решение 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 в первом блоке пропускается.
@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..)
попробуйте следующее:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak
gadeffi
..next ?
echo hello Tunisia
pause