Nhận xét nhiều dòng trong tệp loạt DOS


98

Tôi đã viết tệp MS DOS Batch lớn. Để kiểm tra tệp hàng loạt này, tôi chỉ cần thực hiện một số dòng và muốn ẩn / nhận xét còn lại.

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

Làm thế nào tôi có thể giải quyết vấn đề này?

Câu trả lời:


182

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

goto comment
...skip this...
:comment

11
+1: Thật buồn cười khi sử dụng "goto" cho điều này VÀ nó hoạt động!
rap-2-h

1
Tôi nghĩ rằng những gì buồn cười là không có định nghĩa bình luận thực sự trong dòng lệnh, tôi chỉ không thể chấp nhận REMdòng như dòng bình luận, nó làm cho đầu ra tối nghĩa
MKB

125

Nếu bạn muốn thêm REM ở đầu mỗi dòng thay vì sử dụng GOTO, bạn có thể sử dụng Notepad ++ để thực hiện việc này một cách dễ dàng 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ú


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

1
Wow, không biết notepad ++ có một tính năng hay như vậy! Trên thực tế, tôi thực sự bỏ lỡ nó vì tôi đã quen với Ctrl + 7 trong Eclipse. Đã bình chọn lên đến 42 ;)
Danny Lo

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

2
@BhaskarSingh Kể từ Notepad ++ 7.5.6, bạn có thể chỉ cần đánh dấu văn bản đã được nhận xét; làm "Ctrl + Q", và nó sẽ bỏ ghi chú nó
CreativiTimothy

Nếu bộ não của bạn là thường yếu như tôi nhớ Ctrl-Q, nhấp vào Notepad++: Edit -> Comment/Uncomment.
Timo

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

Mặc dù gotogiải pháp là một lựa chọn tốt nhưng nó sẽ không hoạt động trong dấu ngoặc (bao gồm các lệnh FOR và IF). 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 FORIFcác lệnh vì chúng sẽ được phân tích cú pháp.

Cập nhật

Cập nhật trong câu trả lời của dbenham đã cho tôi một số ý tưởng. Đầu tiên - có hai trường hợp khác nhau mà chúng ta có thể cần nhận xét nhiều dòng - trong ngữ cảnh của dấu ngoặc vuông mà GOTO không thể được sử dụng và bên ngoài nó. Bên trong dấu ngoặc bối cảnh chúng ta có thể sử dụng dấu ngoặc khác nếu có một điều kiện, giúp ngăn chặn các mã được executed.Though mã Thede vẫn sẽ được phân tích và một số lỗi cú pháp sẽ được phát hiện ( FOR, IF, khung không đúng cách khép kín, sai mở rộng tham số ..). Vì vậy, nếu có thể thì tốt hơn nên 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 các nhận xét của dấu ngoặc. Tuy nhiên, hai thủ thuật có thể được sử dụng để làm cho các nhận xét GOTO đồng bộ hơn và dễ chịu hơn (ít nhất là đối với 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 trước nhãn và goto vẫn có thể tìm thấy nó (tôi không biết tại sao lại như vậy. Tôi đoán nó đang tìm kiếm một ổ đĩa). 2) bạn có thể đặt một tên duy nhất : vào cuối tên biến và tính năng thay thế / trừ đi sẽ không được kích hoạt (ngay cả trong các phần mở rộng đã bật). Kết hợp với các macro cho nhận xét trong ngoặc có thể làm cho cả hai trường hợp trông gần như giống nhau.

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

Với dấu ngoặc 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 kiểu powershell và C ( <không thể sử dụng vì chuyển hướng với prio cao hơn. *Không thể sử dụng do %*):

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

Để nhấn mạnh đó là một nhận xét (nghĩ rằng nó không 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 thế. Ý định rõ ràng hơn một chút. Xem câu trả lời cập nhật của tôi.
dbenham 19/09/17

@dbenham - có với rem nó ngắn hơn.
npocmaka

1
Ồ, các dạng dấu ngoặc vuông và xoăn rất gợi cảm. Nếu tôi chỉ viết mã cho chính mình, tôi có thể sử dụng nó. Nhưng tôi tưởng tượng người dùng bình thường sẽ thấy điều đó và nói WTF.
dbenham

@dbenham - có thể bạn là right.I có thể bao gồm %rem:%+ %:rem%hình thức quá để làm cho nó rõ ràng hơn mặc dù nó sẽ mất nó charm.Or chỉ giảm được gần gũi hơn với C-phong cách ...
npocmaka

1
@npocmaka Điều này thật tuyệt vời! Tôi vừa học được một loạt các phức tạp của kịch bản hàng loạt trong khi tìm ra những gì bạn đã làm. Từ tất cả các phương pháp nhận xét khối mà tôi biết (đối với hàng loạt), phương pháp này có vẻ là mạnh mẽ và thông minh nhất. +1 để kết hợp hack và phong cách
Jared Gotte

10

Một tùy chọn khác là bao gồm các dòng không mong muốn trong một 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 thi, nhưng nó 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, bình luận 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 đá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 cải tiến thẩm mỹ cho giải pháp GOTO của pdub . Tôi xác định một biến môi trường đơn giản "macro" làm cho cú pháp nhận xét GOTO tự ghi lại tốt hơn một chút. Mặc dù người ta thường khuyến nghị rằng: các nhãn là duy nhất trong một tập lệnh lô, nhưng thực sự là OK khi nhúng nhiều nhận xét như thế này trong cùng một tập lệnh 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ể này của giải pháp npocmaka . Việc sử dụng REM thay vì BREAK làm cho ý định rõ ràng hơn một chút.

rem.||(
   remarks
   go here
)

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

1

Chỉ muốn đề cập rằng giải pháp GOTO của pdub không hoàn toàn chính xác trong trường hợp: nhãn nhận xét xuất hiện nhiều lần. Tôi sửa đổi mã từ câu hỏi này làm ví dụ.

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

Đầu ra sẽ là

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

Lệnh ECHO HERE AT TD_NEXT TRONG KHỐI ĐẦU TIÊN bị bỏ qua.


0

@jeb

Và sau khi sử dụng điều này, stderr dường như không thể truy cập được

Không, hãy thử cái 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âu hỏi bằng frensh:

(la redirection par 3> est spécial car elle Perse, trên va l'utiliser pour capturer le flux des erreurs 2> est on va le MBA en un flux Persant à l'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environement de script..par la suite si on veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)


1
Tôi không thể đọc tiếng Pháp, nhưng có vẻ như bạn không giải thích được lý do tại sao 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 kiểm tra trong 2 bài đăng liên tiếp tại dostips.com/forum/viewtopic.php?p=14612#p14612 .
dbenham

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

-1

thử cái này:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+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" bởi vì echo 2> Nul đang chuyển hướng luồng lỗi chuẩn thành NUL, chôn vùi nó (3> Nul, 4> Nul đang chuyển hướng các luồng phụ mà không có lý do thực sự). Điều này không nhận xét ra các dòng, nó chỉ ngăn các thông báo lỗi hiển thị. Vì vậy, bất kỳ thứ gì có thể được hiểu là dòng lệnh sẽ vẫn chạy.
pdubs

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

3
Tôi có một lý thuyết về cách hoạt động của chuyển hướng trong Windows batch, và nó giải thích tại sao stderr bị vô hiệu hóa "vĩnh viễn" trong câu trả lời này. Lý thuyết và bài kiểm tra trong 2 bài viết liên tiếp tại dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
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.