programing

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

newstyles 2023. 5. 4. 19:43

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

몇 가지 배치 파일을 작성하고 있었는데, 사용자 가이드를 우연히 보게 되었는데, 는 꽤 유익한 정보였습니다.그것이 나에게 보여준 한 가지는 대사들이 단지 그것으로 논평될 수 없다는 것이었습니다.REM뿐만 아니라 또한::다음과 같이 표시됩니다.

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

그렇다면, 내가 본 대부분의 가이드와 예는 다음을 사용합니까?REM명령?한다::모든 버전의 Windows에서 작동합니까?

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


::뛰어넘을 수 빈, 적으로절대뛰수반없면빈레인이블는기을본어로넘▁that,REM아무것도 하지 않는 실제 명령입니다.두 경우 모두(최소한 윈도우즈 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

캐릭터는 캐릭는터고그리▁character는.;또한 다음 중 하나가 허용됩니다.;,:\/=

REM은 보다 약 6배 느립니다.:: 7(윈도우 7)에서 됨)SP1(댓글 줄이 100,000개 포함).
일반적인 사용에서는 중요하지 않습니다(댓글 줄당 58µs 대 360µs).

댓글::

A ::항상 줄 끝 캐럿을 실행합니다.

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

레이블 및 주석 레이블 ::괄호 블록에 특수 논리가 있습니다.
이들은 항상 두 에 걸쳐 있습니다. 즉, go to 명령이 작동하지 않습니다.
따라서 괄호 블록은 구문 오류의 원인이 되는 경우가 많기 때문에 괄호 블록에는 사용하지 않는 것이 좋습니다.

와 함께ECHO ON a REM되지만, 선이표지주달석린선표않은습다니시지되이만시되로 주석이 .::

둘 다 라인의 나머지 부분에 대해 정말로 언급할 수 없습니다. 그래서 간단한.%~ 구문 오류가 발생합니다.

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

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

@echo ON
REM This caret ^ is visible

&REM 또는 &::를 사용하여 명령줄 끝에 주석을 추가할 수 있습니다.이 접근법은 '&'이 동일한 줄에 새 명령을 도입하기 때문에 작동합니다.

% 기호가 있는 주석 % = 주석 = %

백분율 기호가 있는 주석 스타일이 있습니다.

실제로 이것들은 변수이지만 아무것도 아닌 것으로 확장됩니다.
하지만 장점은 동일한 줄에 배치할 수 있다는 것입니다.&.
등호는 이러한 변수가 존재할 수 없음을 보장합니다.

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

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

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

REM::%= =%

간단히 말해서:

  • ::그리고.%= =%인 것 요.
  • REM보다 50% 더 많은 시간이 소요됩니다.::
  • 록블내, 루프만특만 .REM하지만, 시을소지만하비간,만.::블록을 구문 분석할 때 캐시된 블록에서 제거되므로 시간을 소비하지 않습니다.

자세한 내용은 SO: Batch *.bat 파일속도의 주석에 대한 질문을 참조하십시오.

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

젭의 훌륭한 답변은 특히 언급할 가치가 있습니다. 왜냐하면 그것은 정말로 깊이 있고 많은 가장자리 사건을 다루고 있기 때문입니다.
특히, 변수/모수 참조(예: 잘못 구성된 변수/모수 참조)는 선을 포함하여 아래 솔루션 하나손상시킬 수 있다고 지적합니다.


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

  • 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 주석([줄 끝까지])은 명령 뒤에 배치할 수 있으며, 항상 줄 끝까지 확장됩니다(다시 말하지만, 젭의 답변 제공).

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

    • ver & REM^. ^<comment^> & ver명령 주석삽입할 수 있습니다(다시 말하지만, 젭의 답변 제공). 그러나 방법에 유의하십시오.<그리고.>^다음 문자는 그대로 사용할 수 없기 때문에 -discape하지 않습니다.&또는&&또는||다음 명령을 시작합니다.

    • %= <comment> =%dbenham의 훌륭한 답변에서 자세히 설명한 것처럼, 는 (인수 중에서) 명령 안배치될 수 있기 때문에 가장 유연한 형태입니다.
      설명 텍스트에 포함되지 않거나 포함되지 않는 한 표현식이 항상 문자열로 확장되도록 하는 방식으로 변수 확장 구문을 사용합니다.
      맘에 들다REM,%= <comment> =%과 속이 잘 .(...)블록이지만 시각적으로 더 독특합니다. 유일한 단점은 입력하기 어렵고 구문적으로 틀리기 쉬우며 널리 알려져 있지 않기 때문에 이 기술을 사용하는 소스 코드에 대한 이해를 방해할 수 있습니다.


다중(전체 줄 블록) 주석:

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

  • Zee의 답변은 "null 레이블"을 사용하여 다중 줄 주석을 작성하는 방법을 보여줍니다. 단, 모든 내부 라인을 종료하려면 주의를 기울여야 합니다.^.

  • Rob van der Woude의 블로그 게시물은 임의의 수의 주석 행으로 파일을 끝낼있는 다소 모호한 옵션을 언급합니다.열림은 (non-)을 포함하지 않는 한 이후의 모든 항목을 무시하게 합니다.^ -filen))즉, 블록이 닫히지 않은 한.


사용SET "foo=bar"변수를 정의합니다. 즉, 이름 주위에 큰따옴표를 붙이고=결합된 은 다음과 같은 명령에 필요합니다.SET "foo=bar" & REM Set foo to bar.따라서 의도한 변수 값(다음 명령까지, 이 경우 단일 공간)이 실수로 변수 값의 일부가 되지 않도록 합니다.
으로: (으)로:SET foo="bar"문제를 피할 수 없을 뿐만 아니라 큰따옴표를 값의 일부로 만듭니다.
로 이 는 이문는다있다니습내어에 .SET값 뒤에 오는 실수로 이어지는 공백에도 적용되므로 항상 접근 방식을 사용하는 좋습니다.

또 다른 대안은 댓글을 항상 0으로 확장되는 변수 확장으로 표현하는 것입니다.

에는 변이름포수없습다니를 포함할 수 .=되지 않은 변수(예:
%=ExitCode%그리고.%=C:%에는 어변수이다포수없함다습니할음을 할 수 .=【1】그래서 에 주석을합니다.그래서 나는 때때로 괄호 안에 주석을 포함하기 위해 다음을 사용합니다.

::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

주자=꼭 필요한 것은 아니지만 대칭을 위해 if가 좋습니다.

두 가지 제한이 있습니다.

에 명에포수없니다습할을 포함할 수 .%

에 명에포수없니다습할을 포함할 수 .:

라벨을 할 수 것을 에.::코드를 주석하고 주석을 다는 것REM그냥 내가 보기엔 그냥 못생겼어요.앞서 언급한 바와 같이 이중 콜론은 내부에서 사용 시 문제를 일으킬 수 있습니다.()코드를 차단했지만 레이블을 번갈아가며 해결책을 찾았습니다.::그리고.:space

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

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

처럼 못생기지는 않습니다.REM코드에 약간의 스타일을 추가합니다.

코드 에서는 그서코드블밖사에용다니합서록래다사니▁so▁use용▁outside.::그리고 그 안에서 나는 번갈아 가며.::그리고.:.

그런데, 배치 파일의 헤더와 같은 큰 댓글의 경우, 특별한 명령어와 문자를 간단하게 피할 수 있습니다.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
.
.
.

합니다.*의,@등의 질문

페이지에서는 특정 제약 조건에서 "::"를 사용하는 것이 더 빠르다고 말합니다. 단지 선택할 때 고려해야 할 사항입니다.

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

몇번의 시험과 속임수를 사용한 후에 더 나은 해결책은 더 명백한 것인 것 같습니다...

--> 파서 무결성 실패를 방지하는 가장 좋은 방법은 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.
)

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

불행하게도 이것은 내가 그것을 사용하고 싶은지 확신이 서지 않을 정도로 충분합니다.

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

페이지에서는 이 주제에 대한 매우 상세하고 분석적인 논의를 제공합니다.

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

배치 파일에서 주석을 달 수 있는 여러 가지 방법이 있습니다.

rem 사용

이것이 공식적인 방법입니다.실행하는 데 시간이 더 오래 걸립니다.::케어가 처리되기 전에 파싱을 초기에 중단하는 것으로 보입니다.재요청 전에 백분율 확장이 발생합니다.::식별되므로 잘못된 사용 비율(예: %~백분율이 있으면 오류가 발생합니다.코드 블록 어디에서나 안전하게 사용할 수 있습니다.

:,::또는:;

위해서:: comment': comment'는 잘못된 문자로 시작하므로 잘못된 레이블 이름입니다.하지만 라벨 중간에 콜론을 사용해도 괜찮습니다.레이블의 시작 부분에서 공백이 시작되면 해당 공백이 제거됩니다.: label 되다:label은 두 의 레이블이 .:f:oo그리고.:f rr둘 다로 해석될 것입니다.:f파일에서 나중에 정의된 레이블만 이동합니다.레이블의 나머지 부분은 사실상 주석입니다.에 대한 여러 가지 대안이 있습니다.::여기에 열거된.절대 안돼요goto또는call a ::foo 라벨벨.goto :foo그리고.goto ::foo작동하지 않습니다.

코드 블록 외부에서는 정상적으로 작동하지만 코드 블록의 레이블 이후에는 유효하지 않거나 유효하지 않은 명령줄이 있어야 합니다. :: comment는 실제로 또 다른 유효한 명령입니다.이 명령은 레이블이 아닌 명령으로 해석되며 명령에 우선 순위가 있습니다.어떤 명령어가 다음에 cd하는 것입니까?:: 륨한경작동다니합우볼을 합니다.subst :: C:\그렇지 않으면 볼륨을 찾을 수 없다는 오류가 표시됩니다.그렇기 때문에:;이러한 방식으로는 해석할 수 없으므로 유효한 명령어 역할을 하는 대신 레이블로 해석되기 때문에 거의 틀림없이 더 좋습니다.이것은 재귀적이지 않습니다. 즉, 다음 레이블 뒤에 명령이 필요하지 않습니다.그래서 그들이 둘로 오는 거예요.

예를 들어 레이블 뒤에 올바른 명령을 입력해야 합니다. echo something코드 블록의 레이블에는 하나 이상의 유효한 명령이 있어야 하므로 줄은 두 개씩 쌍을 이루게 됩니다.예상치 못한 일이 발생할 것입니다.)다음 줄에 공백이나 닫는 괄호가 있으면 오류가 발생합니다. 개 에 공백이 경우::오류가 할 수 있습니다. lines는 잘못된 구문 오류입니다.

연산자는 에서 .::다음과 같은 논평:

@echo off

echo hello
(
   :;(^
   this^
   is^
   a^
   comment^
   )
   :;
)
   :;^
   this^
   is^
   a^
   comment
   :;
) 

하지만 당신은 추적이 필요합니다.:;상술한 이유로

@echo off

(
echo hello
:;
:; comment
:; comment
:;
)
echo hello

짝수 번호만 있으면 괜찮습니다.할 여지 없이과 이은의할여지없이가장좋심은개코방멘트법다입니. 4의행과함께것개▁4.:;.와 함께:;다음을 사용하여 억제해야 하는 오류가 없습니다.2> nul또는subst :: C:\사용할 수 있습니다.subst :: C:\볼륨을 찾을 수 없음 오류를 없애려면 C:를 코드에 넣어 작업 디렉터리가 되지 않도록 해야 합니다.::\.

할수있줄끝주에석달을기수행는달▁do▁to기▁at을▁you▁can석주▁comment▁line수행끝에를 할 수 있습니다.command &::또는command & rem comment하지만 여전히 짝수가 있어야 합니다. 예를 들면 다음과 같습니다.

@echo off

(
echo hello & :;yes
echo hello & :;yes
:;
)

echo hello

번째 첫째번째.echo hello & :;yes 두 줄에는 유효한 명령이 있습니다.& :;yes그렇지 않습니다, 그래서 그것은 하나가 필요합니다, 즉.:;.

잘못된 환경 변수 사용

%= comment =%배치 파일에서 정의되지 않은 환경 변수는 스크립트에서 제거됩니다.이를 통해 행 끝에서 다음을 사용하지 않고 사용할 수 있습니다.&잘못된 환경 변수, 즉 등호가 포함된 환경 변수를 사용하는 것이 일반적인 방법입니다.여분의 동등한 값은 필요하지 않지만 대칭적으로 보이게 합니다.또한 "="로 시작하는 변수 이름은 문서화되지 않은 동적 변수용으로 예약됩니다.이러한 동적 변수는 "="로 끝나지 않으므로 설명의 시작과 끝에 모두 "="를 사용하면 이름이 충돌할 가능성이 없습니다.에는 설에포수없다니습할함을 포함할 수 .%또는:.

@echo off 
echo This is an example of an %= Inline Comment =% in the middle of a line.

명령으로 stderr을 null로 리디렉션

@echo off
(
echo hello
;this is a comment 2> nul
;this is another comment  2> nul
)

파일의 끝에서 괄호를 닫지 않은 후의 모든 것은 주석입니다.

@echo off
(
echo hello
)

(this is a comment
this is a comment
this is a comment

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