Answers:
您可以使用goto
跳过代码。
goto comment
...skip this...
:comment
REM
行作为注释行,这使输出变得晦涩
如果要在每行的开头添加REM而不是使用GOTO,则可以按照以下步骤使用Notepad ++轻松完成此操作:
重复步骤以取消注释
Ctrl-Q
,请点击Notepad++
:Edit -> Comment/Uncomment
。
break||(
code that cannot contain non paired closing bracket
)
虽然该goto
解决方案是一个不错的选择,但它不能在方括号内使用(包括FOR和IF命令),但是可以。尽管您应注意不要用括号括起来以及FOR
and IF
命令的无效语法,因为它们将被解析。
更新资料
dbenham答案的更新给了我一些想法。首先-在两种情况下,我们可能需要多行注释-在无法使用GOTO的上下文中以及在它之外。括号内的情况下,我们可以用另一种支架是否有防止代码是executed.Though代码thede仍然会被解析,将被检测的一些语法错误(条件FOR
,IF
,非正常关闭括号,错误的参数扩展..)。所以,如果可能的话,最好使用GOTO。
虽然无法创建用作标签的宏/变量-但可以将宏用于括号的注释。仍然可以使用两个技巧使GOTO注释更加对称和令人愉悦(至少对我而言)。为此,我将使用两个技巧-1)您可以在标签前放置一个符号,goto仍然可以找到它(我不知道为什么会这样,我的想法是要搜索驱动器)。2)您可以:
在变量名的末尾添加一个,并且不会触发替换/替代功能(即使在启用的扩展名下)。Wich与用于括号注释的宏结合可以使两种情况看起来几乎相同。
所以这是示例(按照我最喜欢的顺序):
带矩形括号:
@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
)
rem.||(
或rem^ (
代替。意图更加清晰。看到我更新的答案。
%rem:%
+ %:rem%
形式,使其更明显,尽管它会失去它的魅力。或者仅斜线使其更接近C风格...
另一种选择是将不需要的行封装在永远不会为真的IF块中
if 1==0 (
...
)
当然,if块中的任何内容都不会执行,但是会被解析。因此,您不能在其中包含任何无效的语法。同样,)
除非被转义或引用,否则评论不能包含。由于这些原因,公认的GOTO解决方案更加可靠。(GOTO解决方案也可能更快)
更新2017-09-19
这是pdub的GOTO解决方案的一个外观增强。我定义了一个简单的环境变量“宏”,使GOTO注释语法可以更好地自我记录。尽管通常建议:labels在批处理脚本中是唯一的,但确实可以在这样的批处理脚本中嵌入多个这样的注释。
@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
)
只是想提一下,如果:comment标签多次出现,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
跳过第一个块中TD_NEXT处的命令ECHO HERE AT。
@jeb
使用此命令后,似乎无法访问stderr
不,请尝试以下操作:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak 2>&1
gadeffi
..next ?
echo hello Tunisia
pause
但是为什么行得通呢?
抱歉,我用法语回答这个问题:
(按重定向参数3>使用率不断变化的EST专用车2>使用各种变压器保持性的EST 3>选择合适的方法erreur pour tot notre environement de script..par la suite si on veux recuperer le flux'stderr'il faut faire a unre 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