IT

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

lottoking 2020. 3. 27. 08:12
반응형

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


나는 배치 파일을 작성하고 있으며이 사용자 안내서를 보았습니다.이 정보는 상당히 유익합니다. 그것이 나에게 보여준 한 가지는 줄 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의 훌륭한 답변 은 실제로 심층적으로 진행되며 많은 경우를 다루기 때문에 특별한 언급이 필요합니다.
특히, 그는 지적 misconstructed 변수 / 매개 변수 참조 같은 %~깰 수 있는 포함 - 솔루션 아래의 REM라인을 .


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

  • REM(또는 그 변형) 유일한 공식 주석 구성 이며 가장 안전한 선택 입니다. Joey의 유용한 답변을 참조하십시오 .

  • ::A (널리 사용되는)은 해킹 이, 장점과 단점은 :


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

  • 하나 : 안전을 위해, 내부 예외하게 (...)블록을하고 사용 REM이, 또는 장소 코멘트를하지 않는 내부 (...) 모두.
  • 또는 : inside의 안전한 사용을 위해 고통스럽게 제한적인 규칙을::(...) 기억하십시오 . 다음 코드 조각에 요약되어 있습니다.
@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^ 
)

제임스 K, 내가 한 말의 상당 부분이 잘못되어서 죄송합니다. 내가 한 테스트는 다음과 같습니다.

@ECHO OFF
(
  :: But
   : neither
  :: does
   : this
  :: also.
)

이는 귀하의 설명에 부합하지만 "현재는 예상치 못한"오류로 실패합니다. 에러 메시지.

나는 오늘 좀 더 멀리 테스트를하고 교대가 열쇠가 아니라는 것을 알았지 만 열쇠에는 짝수의 줄이 있고 이중 콜론 (: :)으로 시작하고 이중 콜론으로 끝나지 않는 행에 두 줄이없는 것처럼 보입니다. . 다음을 고려하세요:

@ECHO OFF
(
   : But
   : neither
   : does
   : this
   : cause
   : problems.
)

작동합니다!

그러나 이것을 고려하십시오 :

@ECHO OFF
(
   : Test1
   : Test2
   : Test3
   : Test4
   : Test5
   ECHO.
)

명령을 끝낼 때 짝수 개의 주석을 갖는 규칙이 적용되지 않는 것 같습니다.

불행히도 이것은 다람쥐를 사용하기를 확신하지 못할 정도로 충분합니다.

실제로 가장 좋은 해결책은 내가 생각할 수있는 가장 안전한 방법은 Notepad ++와 같은 프로그램이 REM을 이중 콜론으로 읽은 다음 파일을 저장할 때 이중 콜론을 REM 문으로 다시 쓰는 것입니다. 그러나 나는 그러한 프로그램을 알지 못하고 메모장 ++ 용 플러그인도 알지 못합니다.


페이지 에서 주제에 대한 매우 상세하고 분석적인 토론을 볼 수 있습니다

예제 코드와 다른 옵션의 장단점이 있습니다.

참고 URL : https://stackoverflow.com/questions/12407800/which-comment-style-should-i-use-in-batch-files

반응형