[batch-file] 배치 파일에 어떤 주석 스타일을 사용해야합니까?

배치 파일을 작성하고 있으며이 사용자 안내서를 보았습니다.이 정보는 상당히 유익합니다. 그것이 나에게 보여준 한 가지는 줄 REM뿐만 아니라로 주석을 달 수 있다는 것 입니다 ::. 그것은 말한다 :

배치 코드의 주석은 이중 콜론을 사용하여 작성할 수 있습니다. 리디렉션 기호 전에 레이블이 처리되므로 REM 명령을 사용하는 것보다 낫습니다. ::<remark>문제는 없지만 rem <remark>오류가 발생합니다.

그렇다면 내가 볼 수있는 대부분의 안내서와 예제는 왜 REM명령을 사용 합니까? ::모든 버전의 Windows 에서 작동 합니까 ?



답변

tl; dr : REM 은 배치 파일에 주석을 포함시키는 문서화되고 지원되는 방법입니다.


::본질적으로 절대로 뛰어 넘을 수없는 빈 레이블이며, REM아무것도하지 않는 실제 명령입니다. 두 경우 모두 (Windows 7 이상) 리디렉션 연산자가 있어도 문제가 발생하지 않습니다.

그러나 ::특정 상황에서는 블록이 아닌 레이블로 해석되고 일종의 드라이브 문자로 잘못 작동하는 것으로 알려져 있습니다. 나는 정확히 어디에서 조금 모호하지만 그 단독으로 만 REM독점적으로 사용할 수 있습니다 . 배치 파일에 주석을 포함시키는 문서화되고 지원되는 방법이지만 ::특정 구현의 인공물 일뿐입니다.


다음은 루프 ::에서 문제를 일으키는 예 FOR입니다.

이 예제는 데스크탑에서 호출 된 파일에서 작동 하지 않습니다test.bat .

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

이 예제는 주석으로 올바르게 작동하지만 :

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

출력을 파일로 리디렉션하려고 할 때 문제가있는 것 같습니다. 가장 좋은 추측은이라는 ::이스케이프 된 레이블로 해석된다는 것입니다 :echo.


답변

REM에 대한 의견

A는 REM이 첫 번째 토큰의 끝이 아니라면, 전체 라인, 라인 끝에도 여러 캐럿을 발언 할 수있다.

REM This is a comment, the caret is ignored^
echo This line is printed

REM This_is_a_comment_the_caret_appends_the_next_line^
echo This line is part of the remark

REM 뒤에 일부 문자 .:\/=가 약간 다르게 작동하며 앰퍼샌드에 주석을 달지 않으므로 인라인 주석으로 사용할 수 있습니다.

echo First & REM. This is a comment & echo second

그러나 기존과 같은 파일에 문제 피하기 위해 REM, REM.bat또는 REM;.bat만 수정 변형이 사용되어야한다.

REM^;<space>Comment

그리고 캐릭터 ;는 또한;,:\/=

REM은에 관한 느린 6 회 이상 ::(100000 주석 행과 Win7SP1 테스트).
일반적인 사용법의 경우 중요하지 않습니다 (주석 라인 당 58µs 대 360µs)

:: 의견

A는 ::항상 라인 엔드 캐럿을 실행 합니다.

:: This is also a comment^
echo This line is also a comment

레이블과 주석 레이블 :: 에는 괄호 블록에 특수 논리가 있습니다.
그들은 항상 두 줄에 걸쳐 있습니다 : goto 명령이 작동하지 않습니다 .
따라서 구문 오류의 원인이되기 때문에 괄호 블록에는 권장되지 않습니다.

로 라인 표시되어 있지만 줄은 주석으로ECHO ONREM::

둘 다 실제로 나머지 줄을 주석 처리 할 수 ​​없으므로 간단한 %~구문 오류가 발생합니다.

REM This comment will result in an error %~ ...

그러나 REM은 특수 문자 단계가 완료되기 전에도 초기 단계에서 배치 파서를 중지 할 수 있습니다.

@echo ON
REM This caret ^ is visible

& REM 또는 & ::을 사용 하여 명령 행 끝에 주석을 추가 할 수 있습니다 . 이 접근 방식은 ‘&’가 같은 줄에 새로운 명령을 도입하기 때문에 작동합니다.

퍼센트 기호가있는 주석 % = comment = %

퍼센트 기호가있는 주석 스타일이 있습니다.

실제로 이들은 변수이지만 아무것도 확장되지 않습니다.
그러나 장점은 없이도 같은 줄에 배치 할 수 있다는 것 &입니다.
등호는 그러한 변수가 존재할 수 없도록합니다.

echo Mytest
set "var=3"     %= This is a comment in the same line=%

매크로가 정의 될 때 주석이 제거되므로 런타임 동작을 변경하지 않으므로 배치 매크로에 퍼센트 스타일이 권장됩니다.

set $test=(%\n%
%=Start of code=% ^
echo myMacro%\n%
)


답변

다른 대안은 주석을 항상 확장되지 않는 변수 확장으로 표현하는 것입니다.

변수 이름은 포함 할 수 없습니다 =, 같은 문서화되지 않은 동적 변수를 제외
%=ExitCode%하고 %=C:%. 변수 이름은 =첫 번째 위치 이후를 포함 할 수 없습니다 . 따라서 때로는 다음을 사용하여 괄호로 묶은 블록 내에 주석을 포함시킵니다.

::This comment hack is not always safe within parentheses.
(
  %= This comment hack is always safe, even within parentheses =%
)

인라인 주석을 통합하는 좋은 방법이기도합니다.

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

선행 =은 필요하지 않지만 대칭의 경우는 좋아합니다.

두 가지 제한이 있습니다.

1) 코멘트는 포함 할 수 없습니다 %

2) 코멘트는 포함 할 수 없습니다 :


답변

레이블 ::을 사용 하여 주석을 작성하고 코드를 주석 처리 할 수 있다는 것을 깨달았 REM습니다. 언급했듯이 이중 콜론은 ()차단 된 코드 내부에서 사용될 때 문제를 일으킬 수 있지만 레이블 ::과 코드를 번갈아 사용하여 해결 방법을 발견했습니다.:space

:: This, of course, does
:: not cause errors.

(
  :: But
   : neither
  :: does
   : this.
)

추악하지는 않지만 REM실제로 코드에 약간의 스타일을 추가합니다.

그래서 내가 사용하는 코드 블록 외부 ::와 내부에서 ::와 사이를 번갈아 사용 합니다 :.

그건 그렇고, 배치 파일의 헤더와 같이 많은 수의 주석 덩어리에 대해서는 단순히 goto주석을 달아서 특수 명령과 문자를 완전히 피할 수 있습니다 . 이렇게하면 CMD실제로 해당 라인을 처리하려고 시도하면 히스 가 발생한다는 사실에도 불구하고 원하는 방법이나 스타일의 마크 업을 사용할 수 있습니다 .

@echo off
goto :TopOfCode

=======================================================================
COOLCODE.BAT

Useage:
  COOLCODE [/?] | [ [/a][/c:[##][a][b][c]] INPUTFILE OUTPUTFILE ]

Switches:
       /?    - This menu
       /a    - Some option
       /c:## - Where ## is which line number to begin the processing at.
         :a  - Some optional method of processing
         :b  - A third option for processing
         :c  - A forth option
  INPUTFILE  - The file to process.
  OUTPUTFILE - Store results here.

 Notes:
   Bla bla bla.

:TopOfCode
CODE
.
.
.

사용 당신이 원하는 어느 표기법 *의, @의 등


답변

이 답변은이 페이지의 많은 훌륭한 답변에 대한 실용적인 요약 을 시도합니다 .

jeb의 훌륭한 답변 은 실제로 심층적으로 진행되며 많은 경우를 다루기 때문에 특별한 언급이 필요합니다.
특히, 잘못 구성된 변수 / 파라미터 참조 는 아래의 라인을 포함하여 아래의 솔루션을 모두%~ 손상시킬 수REM 있다고 지적 합니다 .


전체 주석-직접 지원되는 유일한 스타일 :


당신이 경우 않는 사용하려면:: , 당신이 선택할 수 있습니다

  • 하나 : 안전을 위해, 내부 예외하게 (...)블록을하고 사용 REM이, 또는 장소 코멘트를하지 않는 내부 (...) 모두.
  • 또는 : 내부의 안전한 사용을 위해 고통스럽고 제한적인 규칙을::(...) 기억하십시오 . 다음 스 니펫에 요약되어 있습니다.
@echo off

for %%i in ("dummy loop") do (

  :: This works: ONE comment line only, followed by a DIFFERENT, NONBLANK line.
  date /t

  REM If you followed a :: line directly with another one, the *2nd* one
  REM would generate a spurious "The system cannot find the drive specified."
  REM error message and potentially execute commands inside the comment.
  REM In the following - commented-out - example, file "out.txt" would be
  REM created (as an empty file), and the ECHO command would execute.
  REM   :: 1st line
  REM   :: 2nd line > out.txt & echo HERE

  REM NOTE: If :: were used in the 2 cases explained below, the FOR statement
  REM would *break altogether*, reporting:
  REM  1st case: "The syntax of the command is incorrect."
  REM  2nd case: ") was unexpected at this time."

  REM Because the next line is *blank*, :: would NOT work here.

  REM Because this is the *last line* in the block, :: would NOT work here.
)

다른 주석 스타일의 에뮬레이션 -인라인 및 멀티 라인 :

참고 이러한 스타일의 어느 것도 직접 배치 언어에 의해 지원되지 않습니다 할 수 있지만 에뮬레이트 .


인라인 코멘트 :


* 아래의 코드 스 니펫 ver은 실험을 용이하게하기 위해 임의의 명령에 대한 스탠드 인으로 사용 됩니다.
* SET인라인 주석으로 명령이 올바르게 작동하도록 하려면 name=value부품을 큰 따옴표로 묶으십시오 . 예를 들어, SET "foo=bar". [1]

이와 관련하여 우리는 두 가지 하위 유형을 구별 할 수 있습니다.

  • EOL 주석 ([to-the-]-end-of-line])은 명령 뒤에 배치 될 수 있으며 줄 끝까지 계속 확장됩니다 (다시 말해서 jeb ‘s answer ).

    • ver & REM <comment>REM유효한 명령 이라는 사실을 &이용하며 기존 명령 뒤에 추가 명령을 배치하는 데 사용할 수 있습니다.
    • ver & :: <comment>그것의 안전한 사용은 독립형을 사용하는 것보다 훨씬 제한적이기 때문에 실제로(...) 작동하지만 블록 외부에서만 사용할 수:: 있습니다.
  • 인라인 주석-한 줄의 여러 명령 사이 에 또는 주어진 명령 내부 에 이상적으로 배치 됩니다.
    인라인 주석은 가장 유연한 (단일 라인) 양식이며 정의에 따라 EOL 주석으로도 사용될 수 있습니다.

    • ver & REM^. ^<comment^> & ver주석 삽입 명령 사이에 (다시,의 호의 젭의 대답 )하지만, 참고 방법 <>필요하기 ^때문에, 적어 주며을 문자를 다음과 같습니다. : 그대로 사용할 수 없다< > | (이스케이프 반면 &하거나 &&또는 ||개시 다음 명령).

    • %= <comment> =%dbenham의 훌륭한 답변 에서 자세히 설명 했듯이 , 가장 유연한 형식 은 명령 에서 (논쟁 중) 배치 될 수 있기 때문 입니다.
      그것은 방식으로 가변 확장 구문을 활용하는 표현은 항상로 확장되도록 빈 문자열주석 텍스트가 둘 다 포함하지 않는 긴만큼 %:
      처럼 REM, %= <comment> =%물론 외부와 내부 모두 작동 (...)블록을하지만 시각적 특징입니다; 유일한 단점은 타이핑하기가 어렵고 문법적으로 잘못되기 쉽고 널리 알려지지 않았기 때문에 기술을 사용하는 소스 코드의 이해를 방해 할 수 있다는 것입니다.


여러 줄 (전체 줄) 주석 :

  • James K의 답변goto문장과 레이블 을 사용하여 임의 길이와 내용의 여러 줄 주석을 구분하는 방법을 보여줍니다 (이 경우 사용 정보를 저장하는 데 사용).

  • Zee의 답변“널 레이블” 을 사용하여 여러 줄 주석을 만드는 방법을 보여 주지만 모든 내부 줄을로 종료하려면주의를 기울여야합니다 ^.

  • Woude의 블로그 게시물 데르 롭 밴은 당신이 할 수 있습니다 다른 다소 모호한 옵션 언급 종료 주석 행의 임의의 수의 파일을 :의 개방 (에만 무시 다음에 오는 모든 원인 으로 오래가 포함되어 있지 않기 때문에, (비를 ^-escaped) ), 즉, 한 블록이되지 않으므로 폐쇄 .


[1] 사용하여 SET "foo=bar"이름과 주위에 따옴표를 넣어, – 즉, 변수를 정의 =하고 값을 결합하는 -과 같은 명령에 필요한 SET "foo=bar" & REM Set foo to bar.어떤 것을 보장하기 위해 그렇게으로, 다음 (가)이 경우, 다음 명령에 변수 값 (최대 의도 단일 공간)이 우연히 그 일부가되지는 않습니다.
(제쳐두고 : SET foo="bar"문제를 피할뿐만 아니라 큰 따옴표를 값의 일부로 만듭니다 ).
이 문제는 값을 따르는 우발적 인 후행 공백에 내재되어 SET있으며 심지어 적용 되기 때문에 항상 접근 방식을 사용하는 것이 좋습니다 .SET "foo=bar"


답변

페이지는 “::”를 사용하면 특정 제약 조건에서 더 빠를 것이라고 말합니다. 선택시 고려해야 할 사항


답변

좋은 질문입니다 …이 기능도 오랫동안 찾고있었습니다 …

몇 가지 테스트와 트릭 후에 더 나은 솔루션이 더 분명한 것 같습니다 …

-> 파서 무결성 실패를 방지하는 가장 좋은 방법은 REM을 재사용하는 것입니다.

echo this will show until the next REM &REM this will not show

“NULL LABEL”트릭과 함께 여러 줄을 사용할 수도 있습니다 …

::(^
this is a multiline^
comment... inside a null label!^
dont forget the ^caret at the end-of-line^
to assure continuity of text^
)