2011-12-15 40 views
66

Tôi đã viết tệp MS DOS Batch lớn. Để kiểm tra tập tin thực thi này, tôi cần thực hiện một số dòng và muốn ẩn/nhận xét phần còn lại.Nhận xét nhiều dòng trong tệp lô DOS

Tôi có một số dòng nhận xét hiện có bắt đầu bằng :: vì vậy tôi không thể sử dụng :: nữa vì nó sẽ tranh giành tất cả nhận xét.

Bất kỳ trợ giúp nào về vấn đề này sẽ được đánh giá cao. Cảm ơn bạn trước, Jay

Trả lời

129

Bạn có thể sử dụng goto để bỏ qua mã.

goto comment 
...skip this... 
:comment 
+0

Cảm ơn bạn sir! – user219628

+5

+1: Thật vui khi sử dụng "goto" cho điều này VÀ nó hoạt động! –

+0

Tôi nghĩ điều thú vị là không có định nghĩa nhận xét thực sự trong dòng lệnh, tôi không thể chấp nhận dòng 'REM' làm dòng chú thích, nó làm cho đầu ra bị mờ – mkb

-1

thử điều này:

@echo off 2>Nul 3>Nul 4>Nul 

    ben ali 
    mubarak 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 
+0

+1, Nhưng tại sao nó hoạt động? Và sau khi sử dụng điều này, stderr dường như không thể truy cập được – jeb

+1

-1, Điều này "hoạt động" vì echo 2> Nul đang chuyển hướng luồng lỗi chuẩn tới NUL, chôn nó (3> Nul, 4> Nul đang chuyển hướng các luồng phụ trợ không lý do thực sự). Điều này không bình luận ra các dòng, nó chỉ ngăn chặn các thông báo lỗi hiển thị. Vì vậy, bất cứ điều gì có thể được hiểu là dòng lệnh vẫn sẽ chạy. – pdubs

+3

nhận xét pdubs là một phần chính xác trong đó các lệnh vẫn đang thực hiện (và không vì không hợp lệ). Nhưng các lệnh hợp lệ sẽ thực thi mà không có lỗi. Vì vậy, đây không phải là một giải pháp tốt cho bình luận ra dòng mã. Lời giải thích là tại sao luồng 2 (stderr) bị vô hiệu hóa "vĩnh viễn" là không chính xác. – dbenham

0

@jeb

Và sau khi sử dụng này, stderr dường như là không thể tiếp cận

Không, hãy thử này:

@echo off 2>Nul 3>Nul 4>Nul 

    ben ali 
    mubarak 2>&1 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 

Nhưng tại sao nó hoạt động?

xin lỗi, tôi trả lời các câu hỏi trong frensh:

(la chuyển hướng mệnh 3> est đặc biệt xe elle persiste, trên va l'utiliser đổ Capturer le dòng des erreurs 2> est trên va le biến en un flux persistant à l'ade de 3> ceci và nous permettre d'avoir une gestion des erreur rót tout notre environement de script..par la suite si on veux phục hồi le flux 'stderr' il faut faire une tự động chuyển hướng du xử lý 2 > au handle 1> qui n'est autre que la console ..)

+1

Tôi không thể đọc được tiếng Pháp, nhưng có vẻ như bạn không giải quyết được lý do luồng 2 (stderr) tiếp tục bị tắt sau khi chuyển hướng ban đầu kết thúc. Tôi có một lý thuyết khả thi và các trường hợp thử nghiệm trong 2 bài viết liên tiếp tại http://www.dostips.com/forum/viewtopic.php?p=14612#p14612. – dbenham

+0

(Chuyển hướng bằng 3> là đặc biệt bởi vì nó vẫn tồn tại, chúng tôi sẽ sử dụng nó để nắm bắt dòng chảy của lỗi 2> là nó sẽ biến nó thành dòng chảy liên tục thành 3> điều này sẽ cho phép chúng tôi có lỗi quản lý cho bất kỳ kịch bản môi trường của chúng tôi .. sau đó nếu bạn muốn khôi phục luồng 'stderr', chúng tôi phải thực hiện chuyển hướng xử lý khác 2> để xử lý a> không có gì khác ngoài bảng điều khiển ..) – user96403

9

Một tùy chọn khác là gửi kèm các dòng không mong muốn vào khối IF không bao giờ có thể đúng

if 1==0 (
... 
) 

Tất nhiên không có gì trong khối if sẽ được thực hiện, nhưng sẽ được phân tích cú pháp. Vì vậy, bạn không thể có bất kỳ cú pháp không hợp lệ nào bên trong. Ngoài ra, chú thích không thể chứa ) trừ khi nó được thoát hoặc được trích dẫn. Vì những lý do đó, giải pháp GOTO được chấp nhận là đáng tin cậy hơn. (Giải pháp GOTO cũng có thể nhanh hơn)

Cập nhật 2017-09-19

Đây là một nâng cao thẩm mỹ để pdub's GOTO solution. Tôi định nghĩa một biến môi trường đơn giản là "macro" làm cho cú pháp nhận xét GOTO tự tốt hơn một chút. Mặc dù thường được khuyến nghị rằng: nhãn là duy nhất trong một tập lệnh theo lô, thực sự là OK để nhúng nhiều nhận xét như thế này trong cùng một tập lệnh theo lô.

@echo off 
setlocal 

set "beginComment=goto :endComment" 

%beginComment% 
Multi-line comment 1 
goes here 
:endComment 

echo This code executes 

%beginComment% 
Multi-line comment 2 
goes here 
:endComment 

echo Done 

Hoặc bạn có thể sử dụng một trong các biến thể của npocmaka's solution. Việc sử dụng REM thay vì BREAK làm cho mục đích rõ ràng hơn một chút.

rem.||(
    remarks 
    go here 
) 

rem^ ||(
    The space after the caret 
    is critical 
) 
90

Nếu bạn muốn thêm REM vào đầu mỗi dòng thay vì sử dụng GOTO, bạn có thể sử dụng Notepad ++ để làm điều này dễ dàng làm theo các bước sau:

  1. Chọn khối dòng
  2. nhấn Ctrl-Q

Lặp lại các bước để bỏ ghi chú

+3

Mẹo hay. làm cho nó sạch hơn nhiều. – Venom

+0

Wow, không biết notepad ++ có một tính năng tuyệt vời! Trên thực tế thực sự bị mất nó bởi vì tôi đang sử dụng để 'Ctrl + 7 'trong Eclipse. Đã bỏ phiếu tối đa ** 42 **;) –

+0

Còn về việc bỏ ghi chú. Trong đó có bất kỳ phím tắt nào để bỏ ghi chú toàn bộ khối. –

9
break||(
code that cannot contain non paired closing bracket 
) 

Trong khi giải pháp goto là một lựa chọn tốt, nó sẽ không hoạt động within brackets (bao gồm cả lệnh FOR và IF). Nhưng điều này sẽ. Mặc dù bạn nên cẩn thận về việc đóng dấu ngoặc và cú pháp không hợp lệ cho các lệnh FORIF vì chúng sẽ được phân tích cú pháp.

Cập nhật

Bản cập nhật trong câu trả lời dbenham's đã cho tôi một số ý tưởng. Đầu tiên - có hai trường hợp khác nhau mà chúng tôi có thể cần các nhận xét nhiều dòng - trong ngữ cảnh của khung mà GOTO không thể được sử dụng và bên ngoài nó. Dấu ngoặc trong bên trong, chúng ta có thể sử dụng một dấu ngoặc khác nếu có điều kiện ngăn mã được thực hiện. Mặc dù mã sẽ bị phân tích và một số lỗi cú pháp sẽ được phát hiện (FOR, IF, dấu ngoặc không đúng, mở rộng tham số sai. Vì vậy, nếu có thể tốt hơn là sử dụng GOTO.

Mặc dù không thể tạo macro/biến được sử dụng làm nhãn - nhưng có thể sử dụng macro cho nhận xét của khung.Chuyển hai thủ thuật có thể được sử dụng làm cho GOTO nhận xét nhiều hơn về mặt đối xứng và dễ chịu hơn (ít nhất là tôi). Đối với điều này, tôi sẽ sử dụng hai thủ thuật - 1) bạn có thể đặt một biểu tượng ở phía trước nhãn và goto vẫn có thể để tìm nó (Tôi không biết tại sao điều này.). 2) bạn có thể đặt một đơn : vào cuối tên biến và tính năng thay thế/phụ đề sẽ không được kích hoạt (ngay cả trong các tiện ích đã bật). Kết hợp với các macro cho các bình luận dấu ngoặc vuông có thể làm cho cả hai trường hợp trông gần như giống nhau.

Vì vậy, đây là những ví dụ (theo thứ tự tôi thích chúng nhất):

Với khung hình chữ nhật:

@echo off 

::GOTO comment macro 
set "[:=goto :]%%" 
::brackets comment macros 
set "[=rem/||(" & set "]=)" 

::testing 
echo not commented 1 

%[:% 
    multi 
    line 
    comment outside of brackets 
%:]% 

echo not commented 2 

%[:% 
    second multi 
    line 
    comment outside of brackets 
%:]% 

::GOTO macro cannot be used inside for 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %[% 
     multi line 
     comment 
    %]% 
    echo second not commented line of the %%a execution 
) 

Với dấu ngoặc nhọn:

@echo off 

::GOTO comment macro 
set "{:=goto :}%%" 
::brackets comment macros 
set "{=rem/||(" & set "}=)" 

::testing 
echo not commented 1 

%{:% 
    multi 
    line 
    comment outside of brackets 
%:}% 

echo not commented 2 

%{:% 
    second multi 
    line 
    comment outside of brackets 
%:}% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %{% 
     multi line 
     comment 
    %}% 
    echo second not commented line of the %%a execution 
) 

Với dấu ngoặc đơn:

@echo off 

::GOTO comment macro 
set "(:=goto :)%%" 
::brackets comment macros 
set "(=rem/||(" & set ")=)" 

::testing 
echo not commented 1 

%(:% 
    multi 
    line 
    comment outside of brackets 
%:)% 

echo not commented 2 

%(:% 
    second multi 
    line 
    comment outside of brackets 
%:)% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %(% 
     multi line 
     comment 
    %)% 
    echo second not commented line of the %%a execution 
) 

Hỗn hợp giữa PowerShell và C phong cách (< không thể được sử dụng bởi vì chuyển hướng là với PRIO cao hơn.* không thể sử dụng vì sự %*):

@echo off 

::GOTO comment macro 
set "/#:=goto :#/%%" 
::brackets comment macros 
set "/#=rem/||(" & set "#/=)" 

::testing 
echo not commented 1 

%/#:% 
    multi 
    line 
    comment outside of brackets 
%:#/% 

echo not commented 2 

%/#:% 
    second multi 
    line 
    comment outside of brackets 
%:#/% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %/#% 
     multi line 
     comment 
    %#/% 
    echo second not commented line of the %%a execution 
) 

Để emphase đó là một lời nhận xét (nghĩ rằng nó không phải là quá ngắn):

@echo off 

::GOTO comment macro 
set "REM{:=goto :}REM%%" 
::brackets comment macros 
set "REM{=rem/||(" & set "}REM=)" 

::testing 
echo not commented 1 

%REM{:% 
    multi 
    line 
    comment outside of brackets 
%:}REM% 

echo not commented 2 

%REM{:% 
    second multi 
    line 
    comment outside of brackets 
%:}REM% 

::GOTO macro cannot be used inside for 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %REM{% 
     multi line 
     comment 
    %}REM% 
    echo second not commented line of the %%a execution 
) 
+1

Bạn có thể sử dụng 'rem. || (' hoặc 'rem^(' thay vào đó. Mục đích của nó là rõ ràng hơn một chút. Hãy xem câu trả lời cập nhật của tôi – dbenham

+0

@ dbenham - yes with rem nó ngắn hơn. – npocmaka

+1

Ooh. Nếu tôi đang viết mã chỉ cho bản thân mình, tôi có thể sử dụng nó, nhưng tôi tưởng tượng người dùng trung bình sẽ thấy điều đó và nói WTF – dbenham

Các vấn đề liên quan