Mengomentari beberapa baris dalam file batch DOS

98

Saya telah menulis file MS DOS Batch yang sangat besar. Untuk menguji file batch ini saya hanya perlu menjalankan beberapa baris dan ingin menyembunyikan / mengomentari yang tersisa.

Saya memiliki beberapa baris komentar yang sudah ada yang dimulai dengan ::itu saya tidak dapat menggunakan ::lagi karena akan mengacak semua komentar.

Bagaimana saya bisa mengatasi masalah ini?

pengguna219628
sumber

Jawaban:

182

Anda dapat menggunakan a gotountuk melewati kode.

goto comment
...skip this...
:comment
pdubs
sumber
11
+1: Lucu menggunakan "goto" untuk ini DAN berhasil!
rap-2-jam
1
Saya pikir yang lucu adalah tidak ada definisi komentar nyata di baris perintah, saya hanya tidak dapat menerima REMbaris sebagai baris komentar, itu membuat keluaran tidak jelas
mkb
125

Jika Anda ingin menambahkan REM di awal setiap baris daripada menggunakan GOTO, Anda dapat menggunakan Notepad ++ untuk melakukannya dengan mudah dengan mengikuti langkah-langkah berikut:

  1. Pilih blok garis
  2. tekan Ctrl-Q

Ulangi langkah untuk menghapus komentar

cvacca.dll
sumber
6
Tip yang bagus. membuatnya lebih bersih.
Venom
1
Wah, tidak tahu notepad ++ memiliki fitur yang begitu bagus! Sebenarnya sangat merindukannya karena saya terbiasa dengan `Ctrl + 7 'di Eclipse. Memberikan suara hingga 42 ;)
Danny Lo
1
Bagaimana dengan tanda komentar. Di sana ada jalan pintas untuk menghapus komentar seluruh blok.
Bhaskar Singh
2
@BhaskarSingh Pada Notepad ++ 7.5.6, Anda cukup menyorot teks yang telah diberi komentar; lakukan "Ctrl + Q", dan itu akan menghapus komentarnya
CreativiTimothy
Jika otak Anda sering lemah seperti saya ingat Ctrl-Q, klik di Notepad++: Edit -> Comment/Uncomment.
Timo
13
break||(
 code that cannot contain non paired closing bracket
)

Meskipun gotosolusinya adalah opsi yang baik, itu tidak akan berfungsi dalam tanda kurung (termasuk perintah FOR dan IF). Tapi ini akan berhasil. Meskipun Anda harus berhati-hati saat menutup tanda kurung dan sintaks FORdan IFperintah yang tidak valid karena keduanya akan diurai.

Memperbarui

Pembaruan dalam jawaban dbenham memberi saya beberapa ide. Pertama - ada dua kasus berbeda di mana kita membutuhkan komentar multi baris - dalam konteks braket di mana GOTO tidak dapat digunakan dan di luarnya. Di dalam konteks tanda kurung kita dapat menggunakan tanda kurung lain jika ada kondisi yang mencegah kode untuk dieksekusi, meskipun kode tersebut masih akan diurai dan beberapa kesalahan sintaks akan terdeteksi ( FOR,IF tanda kurung yang tidak benar, ekspansi parameter yang salah ..). Jadi jika memungkinkan lebih baik gunakan GOTO.

Meskipun tidak mungkin membuat makro / variabel yang digunakan sebagai label - tetapi dimungkinkan untuk menggunakan makro untuk komentar braket. Namun dua trik dapat digunakan untuk membuat komentar GOTO lebih simetris dan lebih menyenangkan (setidaknya untuk saya). Untuk ini, saya akan menggunakan dua trik - 1) Anda dapat meletakkan satu simbol di depan label dan goto masih dapat menemukannya (saya tidak tahu mengapa ini. Petunjuk saya adalah mencari drive). 2) Anda dapat menempatkan satu: di akhir nama variabel dan fitur penggantian / subtring tidak akan dipicu (bahkan di bawah ekstensi yang diaktifkan). Yang dikombinasikan dengan makro untuk komentar tanda kurung dapat membuat kedua kasus terlihat hampir sama.

Jadi inilah contohnya (dalam urutan yang paling saya sukai):

Dengan tanda kurung persegi panjang :

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

Dengan tanda kurung kurawal :

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

Dengan tanda kurung :

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

Campuran antara PowerShell dan C gaya ( <tidak dapat digunakan karena pengalihan dengan prio lebih tinggi *tidak dapat digunakan karena %*):

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

Untuk menekankan itu adalah komentar (menurut saya tidak terlalu pendek):

@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
)
npocmaka
sumber
1
Anda bisa menggunakan rem.||(atau rem^ (sebaliknya. Maksudnya sedikit lebih jelas. Lihat jawaban terbaru saya.
dbenham
@dbenham - ya dengan rem itu lebih pendek.
npocmaka
1
Ooh, bentuk braket persegi dan keriting itu seksi. Jika saya menulis kode hanya untuk diri saya sendiri, saya mungkin akan menggunakannya. Tapi saya membayangkan rata-rata pengguna akan melihatnya dan berkata WTF.
dbenham
@dbenham - mungkin Anda benar. Saya dapat menyertakan %rem:%+ %:rem%bentuk juga untuk membuatnya lebih jelas meskipun akan kehilangan pesonanya. Atau hanya garis miring agar lebih dekat dengan gaya-C ...
npocmaka
1
@npocmaka Ini luar biasa! Saya baru saja mempelajari banyak seluk-beluk skrip batch sambil mencari tahu apa yang Anda lakukan. Dari semua metode komentar blok yang saya ketahui (untuk batch), metode ini tampaknya yang paling kuat dan pintar. 1 untuk menggabungkan
retasan
10

Pilihan lainnya adalah memasukkan baris yang tidak diinginkan dalam blok IF yang tidak pernah benar

if 1==0 (
...
)

Tentu saja tidak ada dalam blok if yang akan dieksekusi, tetapi akan diurai. Jadi Anda tidak dapat memiliki sintaks yang tidak valid di dalamnya. Juga, komentar tidak boleh berisi) kecuali jika di-escape atau dikutip. Oleh karena itu, solusi GOTO yang diterima lebih dapat diandalkan. (Solusi GOTO mungkin juga lebih cepat)

Perbarui 2017-09-19

Berikut adalah peningkatan kosmetik untuk solusi GOTO pdub . Saya mendefinisikan variabel lingkungan sederhana "makro" yang membuat sintaks komentar GOTO mendokumentasikan sendiri sedikit lebih baik. Meskipun secara umum disarankan bahwa: label itu unik dalam skrip batch, tidak masalah untuk menyematkan banyak komentar seperti ini dalam skrip batch yang sama.

@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

Atau Anda dapat menggunakan salah satu varian solusi npocmaka ini . Penggunaan REM sebagai ganti BREAK membuat maksudnya sedikit lebih jelas.

rem.||(
   remarks
   go here
)

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

Hanya ingin menyebutkan bahwa solusi GOTO pdub tidak sepenuhnya benar dalam kasus: label komentar muncul berkali-kali. Saya memodifikasi kode dari pertanyaan ini sebagai contoh.

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

Outputnya adalah

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

Perintah ECHO DI SINI DI TD_NEXT DI BLOK PERTAMA dilewati.

Charles Chiou
sumber
0

@beb

Dan setelah menggunakan ini, stderr tampaknya tidak dapat diakses

Tidak, coba ini:

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

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

   echo hello Tunisia

  pause

Tapi mengapa ini berhasil?

maaf, saya menjawab pertanyaan di frensh:

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

walid2mi.dll
sumber
1
Saya tidak bisa membaca bahasa Prancis, tetapi sepertinya Anda tidak membahas mengapa streaming 2 (stderr) terus dinonaktifkan setelah pengalihan awal selesai. Saya memiliki teori yang bisa diterapkan dan kasus uji dalam 2 posting berturut-turut di dostips.com/forum/viewtopic.php?p=14612#p14612 .
dbenham
(Pengalihan oleh 3> adalah khusus karena terus berlanjut, kami akan menggunakannya untuk menangkap aliran kesalahan 2> apakah itu akan mengubahnya menjadi aliran persisten ke ade dari 3> ini akan memungkinkan kami untuk memiliki kesalahan manajemen untuk salah satu dari kami skrip lingkungan .. maka jika Anda ingin memulihkan aliran 'stderr' kita harus membuat pengalihan pegangan lain 2> untuk menangani a> yang tidak lain adalah konsol ..)
user96403
-1

coba ini:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause
walid2mi.dll
sumber
+1, Tapi mengapa ini berhasil? Dan setelah menggunakan ini, stderr tampaknya tidak dapat diakses
jeb
1
-1, Ini "bekerja" karena echo 2> Nul sedang mengarahkan aliran kesalahan standar ke NUL, menguburnya (3> Nul, 4> Nul mengarahkan aliran tambahan tanpa alasan yang jelas). Ini tidak mengomentari baris, ini hanya mencegah pesan kesalahan ditampilkan. Jadi apapun yang bisa diartikan sebagai baris perintah akan tetap berjalan.
pdubs
3
komentar pdubs sebagian benar karena perintah masih dijalankan (dan gagal karena tidak valid). Tetapi perintah yang valid akan dijalankan tanpa kegagalan. Jadi ini bukan solusi yang baik untuk mengomentari baris kode. Penjelasan mengapa aliran 2 (stderr) dinonaktifkan "secara permanen" tidak benar.
dbenham
3
Saya memiliki teori tentang bagaimana pengalihan bekerja di batch Windows, dan itu menjelaskan mengapa stderr menjadi "permanen" dinonaktifkan dalam jawaban ini. Teori dan tes ada dalam 2 posting berturut-turut di dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham