DOS 배치 파일에서 여러 줄에 주석 달기


98

거대한 MS DOS 배치 파일을 작성했습니다. 이 배치 파일을 테스트하려면 몇 줄만 실행하고 나머지는 숨기거나 주석 처리해야합니다.

로 시작하는 기존 주석 줄이 ::있으므로 ::모든 주석을 스크램블하므로 더 이상 사용할 수 없습니다 .

이 문제를 어떻게 해결할 수 있습니까?

답변:


182

a goto를 사용하여 코드를 건너 뛸 수 있습니다 .

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

11
+1 : "goto"를 사용하는 것이 재미 있고 작동합니다!
rap-2-h

1
재미있는 것은 명령 행에 실제 주석 정의가 없다는 것입니다. 주석 REM행으로 행을 허용 할 수 없으며 출력을 모호하게 만듭니다
mkb

125

GOTO를 사용하는 대신 각 줄의 시작 부분에 REM을 추가하려면 Notepad ++를 사용하여 다음 단계에 따라 쉽게 수행 할 수 있습니다.

  1. 라인 블록 선택
  2. Ctrl-Q 누르기

주석을 제거하려면 단계를 반복하십시오.


6
좋은 팁. 훨씬 깨끗해집니다.
Venom 2013

1
와, 노트 패드 ++에 이런 멋진 기능이 있는지 몰랐어요! Eclipse에서 'Ctrl + 7'에 익숙하기 때문에 실제로 그것을 놓쳤습니다. 42 까지 투표 ;)
Danny Lo

1
주석 해제는 어떻습니까? 거기에 전체 블록의 주석을 해제하는 바로 가기가 있습니다.
Bhaskar Singh

2
@BhaskarSingh Notepad ++ 7.5.6부터는 이미 주석 처리 된 텍스트 만 강조 표시 할 수 있습니다. "Ctrl 키 + Q"를 수행하고 그것을 주석을 제거합니다
CreativiTimothy

당신의 두뇌가 종종 저처럼 약한 경우 Ctrl-Q에는 Notepad++다음을 클릭하십시오 Edit -> Comment/Uncomment.
Timo

13
break||(
 code that cannot contain non paired closing bracket
)

goto솔루션은 좋은 옵션이지만 FOR 및 IF 명령을 포함하여 대괄호 안에는 작동하지 않습니다 . 닫는 대괄호와 FORIF명령에 대한 잘못된 구문은 구문 분석되므로 주의해야합니다 .

최신 정보

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
)

1
rem.||(또는 rem^ (대신 사용할 수 있습니다 . 의도는 좀 더 명확합니다. 업데이트 된 답변을 참조하십시오.
dbenham

@ dbenham-예, rem을 사용하면 더 짧습니다.
npocmaka

1
오, 네모와 중괄호 형태가 섹시 해요. 나 자신만을위한 코드를 작성한다면 나는 그것을 사용할지도 모른다. 그러나 나는 일반 사용자가 그것을보고 WTF라고 말할 것이라고 생각합니다.
dbenham

@dbenham - 당신이 맞아 포함 할 수있다 할 수있다 %rem:%+ %:rem%너무 양식을 좀 더 분명 그것은 단지 ... 가까이 C-스타일로 슬래시 그것의 charm.Or을 잃어 버리게된다하더라도 만들기 위해
npocmaka

1
@npocmaka 굉장합니다! 나는 당신이 무엇을했는지 알아내는 동안 많은 배치 스크립팅의 복잡성을 배웠습니다. 내가 아는 모든 블록 주석 방법에서 (일괄 처리의 경우) 이것은 가장 강력하고 영리한 것 같습니다. 해킹과 스타일을 결합한 +1
Jared Gotte 17.11.

10

또 다른 옵션은 원치 않는 줄을 참일 수없는 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
)

1

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 명령 은 건너 뜁니다.


0

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


1
프랑스어를 읽을 수는 없지만 초기 리디렉션이 끝난 후에도 스트림 2 (stderr)가 계속 비활성화되는 이유를 설명하는 것 같지 않습니다. dostips.com/forum/viewtopic.php?p=14612#p14612 에 2 개의 연속 게시물에 실행 가능한 이론과 테스트 사례가 있습니다.
dbenham

(3>에 의한 리디렉션은 지속되기 때문에 특별합니다. 오류의 흐름을 캡처하는 데 사용할 것입니다. 2> 3 단계에 대한 지속적인 흐름으로 바뀔 것입니다.이 경우 우리 중 하나에 대해 관리 오류가 발생할 수 있습니다. 환경 스크립트 .. 그런 다음 'stderr'흐름을 복구하려면 다른 핸들 리디렉션 2>를 만들어 콘솔 이외의 a>를 처리해야합니다 ..)
user96403

-1

이 시도:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1,하지만 왜 작동합니까? 그리고 이것을 사용한 후 stderr에 액세스 할 수없는 것 같습니다
jeb

1
-1, 이것은 echo 2> Nul이 표준 오류 스트림을 NUL로 리디렉션하고이를 묻기 때문에 "작동"합니다 (3> Nul, 4> Nul은 실제 이유없이 보조 스트림을 리디렉션합니다). 이것은 행을 주석 처리하지 않고 단지 오류 메시지가 표시되는 것을 방지합니다. 따라서 명령 줄로 해석 할 수있는 모든 것은 계속 실행됩니다.
pdubs dec

3
pdubs 주석은 명령이 여전히 실행 중이라는 점에서 부분적으로 정확합니다 (유효하지 않기 때문에 실패 함). 그러나 유효한 명령은 실패없이 실행됩니다. 따라서 이것은 코드 줄을 주석 처리하는 데 좋은 솔루션이 아닙니다. 스트림 2 (stderr)가 "영구적으로"비활성화 된 이유에 대한 설명이 올바르지 않습니다.
dbenham

3
Windows 배치에서 리디렉션이 작동하는 방식에 대한 이론이 있으며이 답변에서 stderr이 "영구적으로"비활성화되는 이유를 설명합니다. 이론과 실험은 2 개 연속 게시물에 dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.