배치 파일을 작성하고 있으며이 사용자 안내서를 보았습니다.이 정보는 상당히 유익합니다. 그것이 나에게 보여준 한 가지는 줄 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 ON
REM
::
둘 다 실제로 나머지 줄을 주석 처리 할 수 없으므로 간단한 %~
구문 오류가 발생합니다.
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
(또는 그 변형) 유일한 공식 주석 구성 이며 가장 안전한 선택 입니다. Joey의 유용한 답변을 참조하십시오 . -
::
A (널리 사용되는)은 해킹 이, 장점과 단점은 :-
찬성 :
- 시각적 특징 및 타이핑 용이성.
- 속도 는 문제가되지 않지만 jeb의 훌륭한 답변 과 Rob van der Woude의 훌륭한 블로그 게시물을 참조하십시오 .
-
단점 :
- 내부
(...)
블록,::
수 중단 명령을 하고, 안전한 사용을위한 규칙은 기억하기 쉽지 제한하고 있습니다 – 아래를 참조하십시오.
- 내부
-
당신이 경우 않는 사용하려면::
, 당신이 선택할 수 있습니다
- 하나 : 안전을 위해, 내부 예외하게
(...)
블록을하고 사용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^
)