Tôi nên sử dụng kiểu bình luận nào trong các tệp bó?


284

Tôi đã viết một số tệp bó và tôi đã xem hướng dẫn sử dụng này , nó khá nhiều thông tin. Một điều nó cho tôi thấy là các dòng có thể được nhận xét không chỉ với REM, mà còn với ::. Nó nói rằng:

Nhận xét trong mã hàng loạt có thể được thực hiện bằng cách sử dụng dấu hai chấm, điều này tốt hơn so với sử dụng lệnh REM vì nhãn được xử lý trước các ký hiệu chuyển hướng. ::<remark>gây ra không có vấn đề nhưng rem <remark>tạo ra lỗi.

Tại sao sau đó, hầu hết các hướng dẫn và ví dụ tôi thấy sử dụng REMlệnh? Có ::hoạt động trên tất cả các phiên bản Windows không?


3
Chỉ để ghi lại, tôi đã thấy các vấn đề khi "REM" được sử dụng để nhận xét một dòng có chuyển hướng trong Windows 98.
Digger

6
Bên cạnh đó, phù hợp với nhận xét của @ Digger: Hướng dẫn được liên kết dành cho DOS ( command.exe), không phải cmd.exe, bộ xử lý lệnh NT như được tìm thấy trên Windows 2000 trở đi. rem <remark>chỉ hoạt động tốt trong phần sau (vì ít nhất là Windows XP), và REMlà cấu trúc chính thức và là sự lựa chọn an toàn nhất; trong khi ::có những lợi thế của nó, cuối cùng nó là một hack có vấn đề bên trong (…)các khối (như được thảo luận trong nhiều câu trả lời ở đây).
mkuity0


1
Vì vậy, tình huống nào với REM gây ra lỗi chính xác?
TS

Câu trả lời:


360

tl; dr: REM là cách được ghi lại và hỗ trợ để nhúng các bình luận trong các tệp bó.


::về cơ bản là một nhãn trống không bao giờ có thể được nhảy tới, trong khi đó REMlà một lệnh thực tế không làm gì cả. Trong cả hai trường hợp (ít nhất là trên Windows 7), sự hiện diện của các toán tử chuyển hướng gây ra sự cố.

Tuy nhiên, ::được biết là hoạt động sai trong các khối trong một số trường hợp nhất định, được phân tích cú pháp không phải là nhãn mà là một loại ký tự ổ đĩa. Tôi hơi mờ ở nơi chính xác nhưng chỉ một mình nó là đủ để tôi sử dụng REMriêng. Đó là cách được tài liệu và hỗ trợ để nhúng các bình luận trong các tệp bó trong khi đó ::chỉ là một tạo tác của một triển khai cụ thể.


Dưới đây là một ví dụ trong đó ::tạo ra một vấn đề trong một FORvòng lặp.

Ví dụ này sẽ không hoạt động trong một tệp được gọi test.battrên máy tính để bàn của bạn:

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

Trong khi ví dụ này sẽ hoạt động như một bình luận chính xác:

@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

Vấn đề xuất hiện là khi cố gắng chuyển hướng đầu ra thành một tệp. Dự đoán tốt nhất của tôi là nó được giải thích ::như là một nhãn thoát :echo.


1
@Firedan: Tên của tệp bó và vị trí của tệp có phù hợp không (cùng với tên và vị trí của tệp để chuyển hướng đến?). Nếu không, thật tốt khi đơn giản hóa ví dụ.
Joey

15
Liên lạc tốt đẹp thêm một tl; dr
makoshichi

2
Nếu việc sử dụng biến bị trì hoãn trong dòng, :: sẽ gây ra một số thông báo lỗi, ví dụ: Không thể tìm thấy trình điều khiển đĩa cụ thể ..... Vì vậy, tốt hơn nên sử dụng REM.
Scott Chu

2
:: bình luận được phân tích cú pháp và các ký tự đặc biệt như> | kết thúc bình luận, và văn bản sau không được bình luận.
mosh

4
@mosh nói đúng. Ví dụ, %VAR%các biến được mở rộng. Giả sử bạn có (sai) set TARGET=C:\Program Files (x86)\"foo.exe"và bên trong một DO(..)biểu thức bạn có :: echo %TARGET%bạn sẽ gặp lỗi vì (x86)được mở rộng trước khi toàn bộ biểu thức được đánh giá, dẫn đến một DO(..)biểu thức không hợp lệ và các lỗi rất khó giải thích (trong trường hợp này "\ Microsoft đã bất ngờ vào lúc này " ). Bạn thậm chí không cần |hoặc >trong biểu hiện của bạn. A ::không phải là một bình luận thực sự REM, mặc dù.
Abel

161

Nhận xét với REM

Một người REMcó thể nhận xét một dòng hoàn chỉnh, cũng là một dấu mũ nhiều dòng ở cuối dòng, nếu đó không phải là kết thúc của mã thông báo đầu tiên.

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 theo sau bởi một số ký tự .:\/=hoạt động hơi khác một chút, nó không bình luận một dấu và, vì vậy bạn có thể sử dụng nó làm nhận xét nội tuyến.

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

Nhưng để tránh các vấn đề với các tệp hiện có như REM, REM.bathoặc REM;.batchỉ nên sử dụng một biến thể được sửa đổi.

REM^;<space>Comment

Và đối với nhân vật ;cũng được cho phép một trong;,:\/=

REM chậm hơn khoảng 6 lần so với ::(được thử nghiệm trên Win7SP1 với 100000 dòng nhận xét).
Đối với việc sử dụng bình thường, điều đó không quan trọng (58 Lời nói so với 360 Lời trên mỗi dòng nhận xét)

Nhận xét với ::

A ::luôn luôn thực hiện một dòng cuối caret.

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

Các nhãn và cả nhãn nhận xét :: có logic đặc biệt trong các khối ngoặc đơn.
Chúng luôn luôn kéo dài hai dòng SO: lệnh goto không hoạt động .
Vì vậy, chúng không được khuyến nghị cho các khối ngoặc đơn, vì chúng thường là nguyên nhân gây ra lỗi cú pháp.

Với ECHO ONmột REMdòng được hiển thị, nhưng không phải là một dòng nhận xét với::

Cả hai không thể thực sự nhận xét phần còn lại của dòng, vì vậy một đơn giản %~sẽ gây ra lỗi cú pháp.

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

Nhưng REM có thể dừng trình phân tích cú pháp hàng loạt ở giai đoạn đầu, ngay cả trước khi giai đoạn ký tự đặc biệt được thực hiện.

@echo ON
REM This caret ^ is visible

Bạn có thể sử dụng & REM hoặc & :: để thêm nhận xét vào cuối dòng lệnh. Cách tiếp cận này hoạt động vì '&' giới thiệu một lệnh mới trên cùng một dòng.

Nhận xét có dấu phần trăm% = bình luận =%

Có tồn tại một phong cách bình luận với dấu hiệu phần trăm.

Trong thực tế đây là các biến nhưng chúng được mở rộng thành không có gì.
Nhưng lợi thế là chúng có thể được đặt trong cùng một dòng, thậm chí không có &.
Dấu bằng đảm bảo rằng một biến như vậy không thể tồn tại.

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

Kiểu phần trăm được khuyến nghị cho các macro theo lô, vì nó không thay đổi hành vi thời gian chạy, vì nhận xét sẽ bị xóa khi macro được xác định.

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

2
Cần lưu ý rằng các %=bình luận là khó khăn với dấu ngoặc kép, nghĩa là set foo=bar %=bazkết quả trong fooviệc mở rộng bar %=baz, như set foo="bar" %=baz, trong khi chỉ set "foo=bar" %=bazdẫn đến fooviệc mở rộng đến barnhư dự định.
Laststar007

3
@ Laststar007: set "foo=bar"Nói chung, luôn luôn sử dụng kiểu trích dẫn là đáng để giới thiệu, bởi vì đây là hình thức mạnh mẽ nhất phân định rõ ràng giá trị. Vấn đề bạn đang mô tả là cố hữu trong setcủa hành vi, và không cụ thể cho %= … =%nhận xét: trừ khi bạn sử dụng "var=val"trích dẫn, setxem xét tất cả mọi thứ mà đi theo =giá trị, bao gồm cả dấu khoảng trắng (cho đến cuối dòng hoặc, nếu có thể, khi bắt đầu lệnh nội tuyến tiếp theo).
mkuity0

28

Một cách khác là diễn đạt nhận xét dưới dạng mở rộng biến luôn mở rộng thành không có gì.

Tên biến không thể chứa =, ngoại trừ các biến động không có giấy tờ như
%=ExitCode%%=C:%. Không có tên biến nào có thể chứa =sau vị trí số 1. Vì vậy, đôi khi tôi sử dụng những điều sau đây để bao gồm các nhận xét trong một khối ngoặc đơn:

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

Nó cũng là một phương pháp tốt để kết hợp các bình luận nội tuyến

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

Việc dẫn đầu =là không cần thiết, nhưng tôi thích nếu cho sự đối xứng.

Có hai hạn chế:

1) bình luận không thể chứa %

2) bình luận không thể chứa :


CƯỜI LỚN! Làm cho nó một biến quá khổ! Thiên tài! %=ExitCode%? Khéo léo. Học điều mới mỗi ngày!
James K

Bạn ngụ ý rằng dấu vết =là cần thiết. Nhưng dường như không phải vậy.
James K

4
@JamesK - Tôi sử dụng dấu vết =để một cái gì đó như% = ExitCode =% là "nhận xét" chứ không phải là biến động. Tôi thích sử dụng một phong cách luôn luôn hoạt động (ngoại trừ những hạn chế được ghi chú ở cuối câu trả lời tất nhiên).
dbenham

Xem stackoverflow.com/a/20169219/1689714 để tìm hiểu các biến động (ví dụ:% = ExitCode %% = ExitCodeAscii %% = C: %% = D: %% __ CD __% v.v.), ý nghĩa của chúng, cách chúng được thiết lập, vv ..
Kieron Hardy

25

Sau khi tôi nhận ra rằng tôi có thể sử dụng nhãn ::để bình luận và nhận xét mã REMchỉ trông xấu xí đối với tôi. Như đã đề cập, dấu hai chấm có thể gây ra sự cố khi được sử dụng bên trong ()mã bị chặn, nhưng tôi đã phát hiện ra cách khắc phục bằng cách xen kẽ giữa các nhãn :::space

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

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

Nó không xấu như thế REM, và thực sự thêm một chút phong cách vào mã của bạn.

Vì vậy, bên ngoài các khối mã tôi sử dụng ::và bên trong chúng tôi xen kẽ giữa :::.

Nhân tiện, đối với những người bình luận lớn, như trong tiêu đề của tệp bó của bạn, bạn có thể tránh hoàn toàn các lệnh và ký tự đặc biệt bằng cách đơn giản lấy gotoqua các bình luận của bạn. Điều này cho phép bạn sử dụng bất kỳ phương pháp hoặc phong cách đánh dấu nào bạn muốn, mặc dù thực tế là nếu CMDthực sự cố gắng xử lý những dòng đó thì nó sẽ rất khó chịu.

@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
.
.
.

Sử dụng những gì từng ký hiệu bạn muốn *, @v.v.


Làm thế nào để bạn xử lý các /?chuyển đổi để làm cho nó in menu này?
hoang

1
@hoang setlocal ENABLEDELAYEDEXPANSION <NEWLINE> đặt var =% ~ 1 <NEWLINE> echo param param đầu tiên là% 1 <NEWLINE> IF! VAR! == "/?" (SỬ DỤNG GOTO) <NEWLINE>: SỬ DỤNG <NEWLINE> echo blah blah .. <NEWLINE>
GL2014

16
Việc thay thế dấu hai chấm đơn và đôi phải là vấn đề đau đầu khi bạn chèn hoặc xóa một hàng.

@ GL2014 về cơ bản bạn đang nói "bạn không in menu này ". Mã ví dụ của bạn yêu cầu tiếng vang tiền tố cho mỗi dòng ghi chú sử dụng. Câu trả lời của James K là sai lệch đến mức nó cho thấy có một số cách để in các ghi chú sử dụng như được viết.
Timbo

1
@Timbo Tôi đã viết một chương trình con ( :PrintHelp) cho câu trả lời này thực sự làm những gì @hoang yêu cầu. Tôi sử dụng <HELP> và </ HELP> làm điểm đánh dấu nhưng bạn có thể sử dụng bất cứ thứ gì phù hợp với mình.
cdlvcdlv

21

Câu trả lời này cố gắng tóm tắt thực tế về nhiều câu trả lời tuyệt vời trên trang này:

câu trả lời tuyệt vời của jeb xứng đáng được đề cập đặc biệt, bởi vì nó thực sự đi sâu và bao gồm nhiều trường hợp cạnh.
Đáng chú ý, ông chỉ ra rằng một tham chiếu biến / tham số sai cấu trúc như %~có thể phá vỡ bất kỳ giải pháp nào dưới đây - bao gồm REMcác dòng .


Nhận xét toàn dòng - kiểu duy nhất được hỗ trợ trực tiếp:

  • REM(hoặc biến thể trường hợp của chúng) là cấu trúc nhận xét chính thức duy nhất và là lựa chọn an toàn nhất - xem câu trả lời hữu ích của Joey .

  • ::là một hack (được sử dụng rộng rãi) , có ưu và nhược điểm :


Nếu bạn làm muốn sử dụng:: , bạn có những lựa chọn:

  • Hoặc : Để an toàn, hãy tạo một ngoại lệ bên trong (...)các khối và sử dụng REMở đó hoặc không đặt bình luận bên trong (...) hoàn toàn.
  • Hoặc : Ghi nhớ các quy tắc hạn chế đau đớn để sử dụng an toàn ::bên trong(...) , được tóm tắt trong đoạn trích sau:
@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.
)

Mô phỏng các kiểu nhận xét khác - nội tuyến và đa dòng:

Lưu ý rằng không có kiểu nào trong số các kiểu này được hỗ trợ trực tiếp bởi ngôn ngữ bó , nhưng có thể được mô phỏng .


Nội dung bình luận :

* Đoạn mã dưới đây sử dụng verlàm điểm thay thế cho một lệnh tùy ý, để tạo điều kiện cho thử nghiệm.
* Để làm cho SETcác lệnh hoạt động chính xác với các bình luận nội tuyến, trích dẫn hai name=valuephần; ví dụ SET "foo=bar". [1]

Trong bối cảnh này, chúng ta có thể phân biệt hai loại phụ:

  • Nhận xét EOL ([đến cuối dòng]), có thể được đặt sau một lệnh và luôn luôn kéo dài đến cuối dòng (một lần nữa, lịch sự của câu trả lời của jeb ):

    • ver & REM <comment>lợi dụng thực tế REMlà một lệnh hợp lệ và &có thể được sử dụng để đặt một lệnh bổ sung sau một lệnh hiện có.
    • ver & :: <comment>cũng hoạt động, nhưng thực sự chỉ có thể sử dụng được bên ngoài các (...)khối , bởi vì việc sử dụng an toàn của nó thậm chí còn hạn chế hơn so với sử dụng ::độc lập.
  • Nhận xét nội dòng , được đặt giữa nhiều lệnh trên một dòng hoặc lý tưởng ngay cả bên trong một lệnh đã cho.
    Nhận xét nội dòng là hình thức linh hoạt nhất (đơn dòng) và theo định nghĩa cũng có thể được sử dụng làm nhận xét EOL.

    • ver & REM^. ^<comment^> & vercho phép chèn một nhận xét giữa các lệnh (một lần nữa, lịch sự với câu trả lời của jeb ), nhưng lưu ý cách thức <>cần thiết để được ^giải thích, bởi vì các ký tự sau. không thể được sử dụng như-là:< > | (trong khi unescaped &hoặc &&hoặc ||khởi động tiếp theo lệnh).

    • %= <comment> =%, như chi tiết trong câu trả lời tuyệt vời của dbenham , là hình thức linh hoạt nhất , bởi vì nó có thể được đặt bên trong một lệnh (trong số các đối số) .
      Phải mất lợi thế của cú pháp biến mở rộng một cách để đảm bảo rằng biểu thức luôn mở rộng để các chuỗi rỗng - miễn là nội dung bình luận chứa không phải %và cũng không:
      giống như REM, %= <comment> =%hoạt động tốt cả bên ngoài và bên trong (...)khối, nhưng nó là trực quan hơn đặc biệt; mặt trái duy nhất là khó gõ hơn, dễ bị sai về mặt cú pháp và không được biết đến rộng rãi, điều này có thể cản trở sự hiểu biết về mã nguồn sử dụng kỹ thuật này.


Nhận xét nhiều dòng (toàn bộ dòng) :

  • Câu trả lời của James K cho thấy cách sử dụng một gototuyên bố và nhãn để phân định một nhận xét nhiều dòng về độ dài và nội dung tùy ý (trong trường hợp của anh ta, anh ta sử dụng để lưu trữ thông tin sử dụng).

  • Câu trả lời của Zee cho thấy cách sử dụng "nhãn null" để tạo nhận xét nhiều dòng, mặc dù phải cẩn thận để chấm dứt tất cả các dòng bên trong ^.

  • Bài đăng trên blog của Rob van der Woude đề cập đến một tùy chọn hơi khó hiểu khác cho phép bạn kết thúc một tệp với số dòng bình luận tùy ý : Việc mở (chỉ khiến mọi thứ xuất hiện sau đó bị bỏ qua , miễn là nó không chứa (không phải ^-cách) ), tức là miễn là khối không bị đóng .


[1] Sử dụng SET "foo=bar"để xác định các biến - nghĩa là đặt dấu ngoặc kép quanh tên và =giá trị được kết hợp - là cần thiết trong các lệnh như SET "foo=bar" & REM Set foo to bar., để đảm bảo rằng những gì tuân theo giá trị biến dự định (trong trường hợp tiếp theo, trong trường hợp này một không gian duy nhất) không vô tình trở thành một phần của nó.
(Như một bên: SET foo="bar"không những không tránh được vấn đề, nó sẽ làm cho dấu ngoặc kép là một phần của giá trị ).
Lưu ý rằng vấn đề này là cố hữu SETvà thậm chí áp dụng cho khoảng trắng theo dõi ngẫu nhiên theo giá trị, vì vậy nên luôn luôn sử dụng SET "foo=bar"phương pháp này.


7

Đây trang nói rằng sử dụng "::" sẽ nhanh hơn dưới chế nhất định Chỉ cần một điều cần xem xét khi lựa chọn


2
Điều này đúng, ít nhất là cho Win7SP1, ::có thể nhanh hơn 6 lần so vớiREM
Jeb

4

câu hỏi hay ... tôi đã tìm kiếm chức năng này từ lâu rồi ...

Sau một vài thử nghiệm và thủ thuật, có vẻ như giải pháp tốt hơn là giải pháp rõ ràng hơn ...

-> cách tốt nhất tôi tìm thấy để làm điều đó, ngăn chặn sự toàn vẹn của trình phân tích cú pháp, là sử dụng lại REM:

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

bạn cũng có thể sử dụng multiline với thủ thuật "NULL LABEL" ... (đừng quên ^ ở cuối dòng cho liên tục)

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

3

James K, tôi xin lỗi tôi đã sai trong một phần công bằng những gì tôi nói. Bài kiểm tra tôi đã làm như sau:

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

Điều này đáp ứng mô tả của bạn về xen kẽ nhưng thất bại với ") là bất ngờ tại thời điểm này." thông báo lỗi.

Tôi đã thực hiện một số thử nghiệm xa hơn ngày hôm nay và thấy rằng xen kẽ không phải là khóa nhưng có vẻ như khóa đang có số dòng chẵn, không có hai dòng nào liên tiếp bắt đầu bằng dấu hai chấm (: :) và không kết thúc bằng dấu hai chấm . Hãy xem xét những điều sau đây:

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

Những công việc này!

Nhưng cũng xem xét điều này:

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

Quy tắc có số lượng bình luận chẵn dường như không được áp dụng khi kết thúc bằng lệnh.

Thật không may, điều này chỉ đủ để tôi không chắc chắn muốn sử dụng nó.

Thực sự, giải pháp tốt nhất và an toàn nhất mà tôi có thể nghĩ đến là nếu một chương trình như Notepad ++ sẽ đọc REM thành hai dấu hai chấm và sau đó sẽ viết lại hai dấu hai chấm dưới dạng câu lệnh REM khi tệp được lưu. Nhưng tôi không biết về một chương trình như vậy và tôi cũng không biết bất kỳ plugin nào cho Notepad ++ cũng làm điều đó.


2

Một cuộc thảo luận rất chi tiết và phân tích về chủ đề này có sẵn trên trang NÀY

Nó có mã ví dụ và ưu / nhược điểm của các tùy chọn khác nhau.


1
Bạn nên tóm tắt nội dung của các liên kết được cung cấp trong câu trả lời. Mặt khác, nó được gọi là "câu trả lời chỉ liên kết" và hoàn toàn vô dụng nếu liên kết biến mất. Trong trường hợp này, trang được chỉ ra khá hài hước ở chỗ nó đưa ra lựa chọn dựa trên việc tối ưu hóa tốc độ đọc của các tệp bó từ đĩa mềm chậm :)
GreenAsJade

0

Có một số cách để bình luận trong một tệp bó

1) Sử dụng rem

Đây là cách chính thức. Nó dường như mất nhiều thời gian để thực thi hơn ::, mặc dù nó dường như dừng phân tích cú pháp sớm, trước khi các dấu mũ được xử lý. Phần trăm mở rộng xảy ra trước khi rem và ::được xác định, do đó phần trăm sử dụng không chính xác tức là %~sẽ gây ra lỗi nếu phần trăm có mặt. An toàn để sử dụng bất cứ nơi nào trong khối mã.

2) Sử dụng nhãn :, ::hoặc :;vv

:: comment, ': bình luận' là tên nhãn không hợp lệ vì nó bắt đầu bằng ký tự không hợp lệ. Mặc dù vậy, sử dụng dấu hai chấm ở giữa nhãn là được. Nếu một không gian bắt đầu vào lúc bắt đầu của nhãn, nó được lấy ra : labeltrở thành :label. Nếu một khoảng trắng hoặc dấu hai chấm xuất hiện ở giữa nhãn, phần còn lại của tên không được hiểu nghĩa là nếu có hai nhãn :f:oo:f rrcả hai sẽ được hiểu là :fvà chỉ nhãn được xác định sau trong tệp sẽ được nhảy tới. Phần còn lại của nhãn hiệu quả là một bình luận. Có nhiều lựa chọn thay thế ::, được liệt kê ở đây . Bạn không bao giờ có thể gotohoặc callmột ::foonhãn hiệu. goto :foogoto ::foosẽ không hoạt động.

Chúng hoạt động tốt bên ngoài các khối mã nhưng sau một nhãn trong khối mã, không hợp lệ hay không, phải có một dòng lệnh hợp lệ. :: commentthực sự là một lệnh hợp lệ khác. Nó diễn giải nó như một lệnh và không phải là nhãn; lệnh đã được ưu tiên. Đó là lệnh để cd vào ::âm lượng, sẽ hoạt động nếu bạn đã thực thi subst :: C:\, nếu không bạn sẽ không thể tìm thấy lỗi âm lượng. Đó là lý do tại sao :;tốt hơn bởi vì nó không thể được hiểu theo cách này, và do đó được hiểu là một nhãn thay thế, phục vụ như là lệnh hợp lệ. Đây không phải là đệ quy, tức là nhãn tiếp theo không cần lệnh sau nó. Đó là lý do tại sao họ đến trong twos.

Bạn cần cung cấp một lệnh hợp lệ sau nhãn, ví dụ echo something. Một nhãn trong một khối mã phải đi kèm với ít nhất một lệnh hợp lệ, vì vậy các dòng đi theo cặp hai. Bạn sẽ gặp một )lỗi không mong muốn nếu có dấu cách hoặc dấu ngoặc đơn đóng trên dòng tiếp theo. Nếu có khoảng trắng giữa hai ::dòng, bạn sẽ gặp lỗi cú pháp không hợp lệ.

Bạn cũng có thể sử dụng toán tử dấu mũ trong ::nhận xét như vậy:

@echo off

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

Nhưng bạn cần dấu vết :;cho lý do đã nêu ở trên.

@echo off

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

Nó là tốt miễn là có một số chẵn. Đây chắc chắn là cách tốt nhất để bình luận - với 4 dòng và :;. Với :;bạn, không có bất kỳ lỗi nào cần phải được loại bỏ bằng cách sử dụng 2> nulhoặc subst :: C:\. Bạn có thể sử dụng subst :: C:\để làm cho âm lượng không tìm thấy lỗi biến mất nhưng điều đó có nghĩa là bạn cũng sẽ phải đặt C: vào mã để ngăn thư mục làm việc của bạn trở thành ::\.

Để bình luận ở cuối dòng bạn có thể làm command &::hoặc command & rem comment, nhưng vẫn phải có một số chẵn, như vậy:

@echo off

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

echo hello

Dòng đầu tiên echo hello & :;yescó một lệnh hợp lệ trên dòng tiếp theo nhưng dòng thứ hai & :;yesthì không, vì vậy nó cần một lệnh tức là :;.

3) Sử dụng biến môi trường không hợp lệ

%= comment =%. Trong một tệp bó, các biến môi trường không được xác định sẽ bị xóa khỏi tập lệnh. Điều này làm cho nó có thể sử dụng chúng ở cuối dòng mà không cần sử dụng &. Nó là tùy chỉnh để sử dụng một biến môi trường không hợp lệ, tức là một biến có chứa dấu bằng. Các giá trị bằng không được yêu cầu nhưng làm cho nó trông đối xứng. Ngoài ra, tên biến bắt đầu bằng "=" được dành riêng cho các biến động không có giấy tờ. Các biến động đó không bao giờ kết thúc bằng "=", do đó, bằng cách sử dụng "=" ở cả đầu và cuối của nhận xét, không có khả năng xảy ra xung đột tên. Nhận xét không thể chứa %hoặc :.

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

4) Như một lệnh, chuyển hướng stderr đến nul

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

5) Ở cuối tập tin, mọi thứ sau dấu ngoặc đơn không được tiết lộ là một nhận xét

@echo off
(
echo hello
)

(this is a comment
this is a comment
this is a comment
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.