거대한 MS DOS 배치 파일을 작성했습니다. 이 배치 파일을 테스트하려면 몇 줄만 실행하고 나머지는 숨기거나 주석 처리해야합니다.
로 시작하는 기존 주석 줄이 ::
있으므로 ::
모든 주석을 스크램블하므로 더 이상 사용할 수 없습니다 .
이 문제를 어떻게 해결할 수 있습니까?
거대한 MS DOS 배치 파일을 작성했습니다. 이 배치 파일을 테스트하려면 몇 줄만 실행하고 나머지는 숨기거나 주석 처리해야합니다.
로 시작하는 기존 주석 줄이 ::
있으므로 ::
모든 주석을 스크램블하므로 더 이상 사용할 수 없습니다 .
이 문제를 어떻게 해결할 수 있습니까?
답변:
GOTO를 사용하는 대신 각 줄의 시작 부분에 REM을 추가하려면 Notepad ++를 사용하여 다음 단계에 따라 쉽게 수행 할 수 있습니다.
주석을 제거하려면 단계를 반복하십시오.
Ctrl-Q
에는 Notepad++
다음을 클릭하십시오 Edit -> Comment/Uncomment
.
break||(
code that cannot contain non paired closing bracket
)
이 goto
솔루션은 좋은 옵션이지만 FOR 및 IF 명령을 포함하여 대괄호 안에는 작동하지 않습니다 . 닫는 대괄호와 FOR
및 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
)
하기 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
)
rem.||(
또는 rem^ (
대신 사용할 수 있습니다 . 의도는 좀 더 명확합니다. 업데이트 된 답변을 참조하십시오.
%rem:%
+ %:rem%
너무 양식을 좀 더 분명 그것은 단지 ... 가까이 C-스타일로 슬래시 그것의 charm.Or을 잃어 버리게된다하더라도 만들기 위해
또 다른 옵션은 원치 않는 줄을 참일 수없는 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 솔루션 의 이러한 변형 중 하나를 사용할 수 있습니다 . BREAK 대신 REM을 사용하면 의도가 좀 더 명확 해집니다.
rem.||(
remarks
go here
)
rem^ ||(
The space after the caret
is critical
)
pdub의 GOTO 솔루션 은 : comment 레이블이 여러 번 나타나는 경우 완전히 정확하지 않다는 것을 언급하고 싶습니다 . 이 질문 의 코드를 예제로 수정합니다 .
@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 IN THE FIRST BLOCK 명령 은 건너 뜁니다.
@jeb
그리고 이것을 사용한 후 stderr에 액세스 할 수없는 것 같습니다.
아니오, 이것을 시도하십시오 :
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak 2>&1
gadeffi
..next ?
echo hello Tunisia
pause
하지만 왜 작동합니까?
죄송합니다, 저는 열광적으로 질문에 대답합니다.
(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