배치 파일에 어떤 주석 스타일을 사용해야합니까?
나는 배치 파일을 작성하고 있으며이 사용자 안내서를 보았습니다.이 정보는 상당히 유익합니다. 그것이 나에게 보여준 한 가지는 줄 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의 훌륭한 답변 은 실제로 심층적으로 진행되며 많은 경우를 다루기 때문에 특별한 언급이 필요합니다.
특히, 그는 지적 misconstructed 변수 / 매개 변수 참조 같은 %~
깰 수 있는 포함 - 솔루션 아래의 REM
라인을 .
전체 주석-직접 지원되는 유일한 스타일 :
REM
(또는 그 변형) 유일한 공식 주석 구성 이며 가장 안전한 선택 입니다. Joey의 유용한 답변을 참조하십시오 .::
A (널리 사용되는)은 해킹 이, 장점과 단점은 :찬성 :
- 시각적 특징 및 타이핑 용이성.
- 속도 는 문제가되지 않지만 jeb의 훌륭한 답변 과 Rob van der Woude의 훌륭한 블로그 게시물을 참조하십시오 .
단점 :
- 내부
(...)
블록,::
수 중단 명령을 하고, 안전한 사용을위한 규칙은 기억하기 쉽지 제한하고 있습니다 - 아래를 참조하십시오.
- 내부
당신이 경우 않는 사용하려면::
, 당신이 선택할 수 있습니다
- 하나 : 안전을 위해, 내부 예외하게
(...)
블록을하고 사용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
'IT' 카테고리의 다른 글
배열에 새로운 요소를 추가하는 방법? (0) | 2020.03.27 |
---|---|
MySQL에서 테이블 열 이름을 가져 옵니까? (0) | 2020.03.27 |
하나의 gradle 파일에 여러 개의 maven 저장소 (0) | 2020.03.27 |
clang 오류 : 알 수없는 인수 : '-mno-fused-madd'(파이썬 패키지 설치 실패) (0) | 2020.03.27 |
RVM과 함께 Lion에서 Ruby를 설치할 수 없음 – GCC 문제 (0) | 2020.03.27 |