Làm thế nào để bình luận ra-ra-tô-tô (thêm bình luận) trong một đợt / cmd?


881

Tôi có một tệp bó chạy một số tập lệnh python có sửa đổi bảng.

  1. Tôi muốn người dùng nhận xét 1-2 tập lệnh python mà họ không muốn chạy, thay vì xóa chúng khỏi tệp bó (để người dùng tiếp theo biết các tập lệnh này tồn tại dưới dạng tùy chọn!)

  2. Tôi cũng muốn thêm ý kiến ​​để chú ý đến họ một cách cụ thể các biến họ cần cập nhật trong tệp Batch trước khi họ chạy nó. Tôi thấy rằng tôi có thể sử dụng REM. Nhưng có vẻ như đó là nhiều hơn để cập nhật người dùng với tiến trình sau khi họ chạy nó.

Có một cú pháp để thêm một bình luận thích hợp?


6
Xem thêm câu trả lời tuyệt vời tại đây stackoverflow.com/q/12407800/1011025
ndemou

2
Bạn có thể sử dụng Rem Sthlệnh hoặc sử dụng dấu này::: Sth
nhà khoa

Câu trả lời:


879

Các remlệnh thực sự là để lấy ý kiến. Nó vốn không cập nhật bất cứ ai sau khi chạy tập lệnh. Tuy nhiên, một số tác giả kịch bản có thể sử dụng nó theo cách đó thay echovì bởi vì theo mặc định, trình thông dịch bó sẽ in ra từng lệnh trước khi nó được xử lý. Vì remcác lệnh không làm gì cả, nên an toàn khi in chúng mà không có tác dụng phụ. Để tránh in lệnh, hãy thêm tiền tố vào @, hoặc, để áp dụng cài đặt đó trong suốt chương trình, hãy chạy @echo off. (Đó là echo offđể tránh in lệnh hơn nữa; những @là để tránh in rằng lệnh trước khi thiết lập có hiệu lực tiếng vang.)

Vì vậy, trong tệp bó của bạn, bạn có thể sử dụng tệp này:

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py

405
bạn cũng có thể sử dụng hai dấu hai chấm "::". Đây là một trong hai cách thêm nhận xét vào tệp bó mà không hiển thị hoặc thực thi dòng đó khi tệp bó được chạy. Không giống như REM, dòng này sẽ không hiển thị bất kể nếu tắt ECHO trong tệp bó.
Brent81

12
@ Brent81 Tôi cảm thấy đây là câu trả lời chính xác. Khi sử dụng cú pháp tô sáng, lệnh REM không thực sự làm nổi bật văn bản là "đã nhận xét".
Automatico

17
Dấu hai chấm là một "nhãn không hợp lệ"; đây là một bài viết giải thích về nó và tại sao hiệu suất của nó có thể tốt hơn REM (đặc biệt là trên các đĩa mềm!) và nó sẽ không hoạt động trong các khối mã thụt lề (chỉ trên ký tự đầu tiên): robvanderwoude.com/comments.php
Michael Paulukonis

4
Hấp dẫn. Tôi mặc dù REM là 'toàn bộ nhận xét' và dấu hai chấm là 'nhận xét nội tuyến', giống nhưREM This whole line is a comment @echo off :: This comment is inline
Richard Smith

@Alhadis, tập lệnh Configure của Perl được viết bằng shell Bourne, không phải đợt Windows, vậy nó có liên quan như thế nào ở đây? Hơn nữa, lệnh dấu hai chấm là cú pháp Bourne hợp lệ không phải là "hiệu ứng phụ"; chính xác là tại sao nó được sử dụng trong kịch bản Bourne đó . Nó được sử dụng để ủng hộ #cho các bình luận bởi vì #, rõ ràng, có thể không phải là một người chỉ định nhận xét hợp lệ trong tất cả các shell Cấu hình nhằm hỗ trợ; xem dòng 3.
Rob Kennedy

955

Sử dụng ::hoặcREM

::   commenttttttttttt
REM  commenttttttttttt

NHƯNG (như mọi người lưu ý):

  • Nếu bạn sử dụng nội tuyến, bạn cần thêm &ký tự:
    your commands here & :: commenttttttttttt
  • Bên trong logic lồng nhau ( IF/ELSE, FORvòng lặp, v.v ...) sử dụng REM::đưa ra lỗi.
  • :: có thể thất bại trong setlocal ENABLEDELAYEDEXPANSION

79
Dấu hai chấm :: Là bình luận .bat sạch nhất có. Và nó có thể được sử dụng ở đầu hoặc giữa dòng!
ATSiem

10
Không làm việc cho tôi khi thực hiện nội tuyến như thế này. cd "C:\Folder" ::this throws a syntax error
Shaun Rowan

3
Cũng thất bại git add :: blah this is not a commentvới "fatal: pathspec 'blah' không khớp với bất kỳ tập tin nào"
Bob Stein

19
Đối với một nhận xét trên cùng một dòng như ví dụ minh họa, bạn cần thêm &giữa mã và nhận xét ::. Để minh họa, mở cmd nhanh chóng và chạy dir ::blahmà không liệt kê các nội dung của .và so sánh với dir & ::blah, mà không
Rado

19
Cảnh báo, sử dụng ::sẽ sửa các tập lệnh với setlocal ENABLEDELAYEDEXPANSIONfor
Azevedo

50

Không, tập tin lô cũ đơn giản sử dụng REMnhư một nhận xét. ECHOlà lệnh in một cái gì đó trên màn hình.

Để "bình luận" các phần của tập tin bạn có thể sử dụng GOTO. Một ví dụ về tất cả các lệnh / kỹ thuật này:

REM it starts here the section below can be safely erased once the file is customised
ECHO Hey you need to edit this file before running it!  Check the instructions inside
ECHO Now press ctrl-c to interrupt execution or enter to continue
PAUSE
REM erase the section above once you have customised the file
python executed1.py
ECHO Skipping some stuff now
GOTO End
python skipped1.py
python skipped2.py
:END
python executed2.py

Tôi có thể nói gì? các tập tin hàng loạt là một di tích của thời gian dài, chúng rất cục mịch và xấu xí.

Bạn có thể đọc thêm trên trang web này .

EDIT: đã sửa đổi ví dụ một chút để có nó chứa các yếu tố mà bạn đang tìm kiếm.


31

:: thay vì REM được sử dụng tốt nhất vào thời mà máy tính không hoạt động rất nhanh. Dòng REM'ed được đọc và sau đó ăn sâu. :: 'ed dòng được bỏ qua tất cả các cách. Điều này có thể tăng tốc mã của bạn trong "ngày xưa". Hơn nữa sau một REM bạn cần một khoảng trắng, sau :: bạn không.

Và như đã nói trong bình luận đầu tiên: bạn có thể thêm thông tin vào bất kỳ dòng nào bạn cảm thấy cần

SET DATETIME=%DTS:~0,8%-%DTS:~8,6% ::Makes YYYYMMDD-HHMMSS

Đối với việc bỏ qua các bộ phận. Đặt REM trước mỗi dòng có thể khá tốn thời gian. Như đã đề cập bằng cách sử dụng GOTO để bỏ qua các phần là một cách dễ dàng để bỏ qua các đoạn mã lớn. Hãy chắc chắn đặt: LABEL tại điểm bạn muốn mã tiếp tục.

SOME CODE

GOTO LABEL  ::REM OUT THIS LINE TO EXECUTE THE CODE BETWEEN THIS GOTO AND :LABEL

SOME CODE TO SKIP
.
LAST LINE OF CODE TO SKIP

:LABEL
CODE TO EXECUTE

1
Làm thế nào một dòng hai dấu hai chấm có thể được bỏ qua mà không được đọc? Trước tiên, không phải là thông dịch viên đọc dòng trước khi nhận ra nó là một dòng hai dấu hai chấm?
Rob Kennedy

2
@RobKennedy khi tôi đọc câu trả lời, nó không đọc gì sau ::, trong đó mọi thứ sau khi đọc REM.
James Jenkins

5
Nếu trình thông dịch lệnh ngừng đọc , @James, thì nó sẽ không bao giờ thực thi bất kỳ tệp nào nữa. Nó rõ ràng cần phải tiếp tục đọc để khám phá nơi bình luận kết thúc và nơi dòng tiếp theo của tập tin bắt đầu. Nó phải làm điều đó với ::rembằng nhau.
Rob Kennedy

2
@RobKennedy, tôi cũng nghĩ nó được ngụ ý rằng nó chỉ áp dụng cho dòng lệnh được bật.
James Jenkins

7
@RobKennedy nó đọc nhưng nó không phân tích (hoặc xử lý) những gì nó đọc, nó chỉ bỏ qua cho đến lần tiếp theo \nvà sau đó bắt đầu phân tích lại [cần dẫn nguồn]
xDaizu

25

Nhận xét nhiều dòng

Nếu có số lượng lớn dòng bạn muốn bình luận thì sẽ tốt hơn nếu bạn có thể đưa ra nhận xét nhiều dòng thay vì bình luận mỗi dòng.

Xem bài đăng này của Rob van der Woude trên các khối nhận xét :

Ngôn ngữ hàng loạt không có khối nhận xét, mặc dù có nhiều cách để thực hiện hiệu ứng.

GOTO EndComment1
This line is comment.
And so is this line.
And this one...
:EndComment1

Bạn có thể sử dụng GOTONhãn và: Nhãn để tạo nhận xét khối.

Hoặc, nếu khối nhận xét xuất hiện ở cuối tệp bó, bạn có thể viết EXITở cuối mã và sau đó là bất kỳ số lượng nhận xét nào để bạn hiểu.

@ECHO OFF
REM Do something
  •
  •
REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later
EXIT

Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...

cái này thường được sử dụng trong các tập lệnh hybrid & VBS / JS, mặc dù chúng được sử dụng nếu ifthay vì goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hy điều.html stackoverflow.com/a/34512715/995714
phuclv

13

Đưa bình luận trên cùng một dòng với các lệnh: use & :: comment

color C          & :: set red font color
echo IMPORTANT INFORMATION
color            & :: reset the color to default

Giải trình:

&tách hai lệnh , vì vậy trong trường hợp color Cnày là lệnh đầu tiên và :: set red font colorlà lệnh thứ hai.


Quan trọng:

Tuyên bố này với nhận xét có vẻ trực giác chính xác:

goto error1         :: handling the error

nhưng nó không phải là một cách sử dụng hợp lệ của bình luận. Nó chỉ hoạt động vì gotobỏ qua tất cả các đối số qua cái đầu tiên. Bằng chứng là dễ dàng, điều này gotocũng sẽ không thất bại:

goto error1 handling the error

Nhưng nỗ lực tương tự

color 17            :: grey on blue

không thực hiện lệnh do 4 đối số không biết đến colorlệnh: ::, grey, on, blue.

Nó sẽ chỉ hoạt động như:

color 17     &      :: grey on blue

Vì vậy, ampersand là không thể tránh khỏi.


Từ những câu trả lời khác, có vẻ như không cần thiết?
RoG

3
@Snaptastic - Các câu trả lời khác thực sự sai ở điểm này, xem chỉnh sửa gần đây của tôi.
miroxlav

Đây dường như là cách chính xác; Nó thậm chí còn được làm nổi bật như nhận xét trong IDE của tôi.
baburao

5

Bạn có thể nhận xét một cái gì đó bằng cách sử dụng ::hoặc REM:

your commands here
:: commenttttttttttt

hoặc là

your commands here
REM  commenttttttttttt

 

Để thực hiện trên cùng một dòng với lệnh, bạn phải thêm dấu và:

your commands here      & ::  commenttttttttttt

hoặc là

your commands here      & REM  commenttttttttttt

 

Ghi chú:

  • Sử dụng :: logic lồng nhau ( IF-ELSE, FORvòng lặp, v.v ...) sẽ gây ra lỗi. Trong những trường hợp đó, sử dụng REMthay thế.

Điều này dựa trên câu trả lời của T.Todua. Tôi cảm thấy rằng câu trả lời của họ là tốt nhưng bỏ qua một số chi tiết quan trọng, nhưng họ đã khôi phục lại bản chỉnh sửa của tôi, vì vậy tôi đang biến bản sửa đổi của mình thành câu trả lời của riêng mình.
Pikamander2

Pikamander2, bản sửa đổi của bạn (cũng được chỉ ra bởi người dùng @Rado đã được hợp nhất trong câu trả lời vào thời điểm đó và cảm ơn vì điều đó, chỉ là tôi thích một kiểu dáng khác để trả lời và sử dụng kiểu dáng khác nhau.
T.Todua

1

Đây là một chủ đề cũ và tôi muốn thêm sự hiểu biết của mình ở đây để mở rộng kiến ​​thức về chủ đề thú vị này.

Sự khác biệt chính giữa REM và :: là:

REM là một lệnh chính nó, trong khi :: là KHÔNG.

Chúng ta có thể coi :: như một mã thông báo mà ngay khi trình phân tích cú pháp CMD gặp không gian trống đầu tiên trong một dòng là :: mã thông báo này, nó sẽ chỉ bỏ qua toàn bộ dòng và đọc dòng tiếp theo. Đó là lý do tại sao REM phải được theo sau bởi ít nhất một khoảng trống để có thể hoạt động như một nhận xét cho dòng, trong khi :: không cần bất kỳ khoảng trống nào phía sau nó.

REM đó là một lệnh có thể được hiểu rõ nhất từ cú pháp FOR sau

Cú pháp FOR cơ bản như sau

FOR %v in (set) DO <Command> [command param] 

Ở đây <Command>có thể là bất kỳ lệnh hợp lệ nào. Vì vậy, chúng ta có thể viết dòng lệnh hợp lệ sau đây như remlà một lệnh

FOR %i in (1,2,3) DO rem echo %i

Tuy nhiên, chúng tôi KHÔNG THỂ viết dòng sau vì ::đây không phải là lệnh

FOR %i in (1,2,3) DO :: echo %i

3
về mặt kỹ thuật, ::là nhãn (không hợp lệ) (giải thích hành vi của nó) và do đó không nên được sử dụng (mặc dù nó vẫn khá phổ biến)
Stephan

1

Bạn có thể thêm nhận xét vào cuối tệp bó với cú pháp này:

@echo off
:: Start of code
...
:: End of code

(I am a comment
So I am!
This can be only at the end of batch files

Chỉ cần chắc chắn rằng bạn không bao giờ sử dụng dấu ngoặc đơn đóng.

Thuộc tính: Leo Guttirez Ramirez trên https://www.robvanderwoude.com/comments.php

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.