Gaya komentar mana yang harus saya gunakan dalam file batch?

284

Saya telah menulis beberapa file batch, dan saya melihat panduan pengguna ini , yang cukup informatif. Satu hal yang ditunjukkan kepada saya adalah bahwa kalimat dapat dikomentari tidak hanya dengan REM, tetapi juga dengan ::. Ia mengatakan:

Komentar dalam kode batch dapat dibuat dengan menggunakan titik dua, ini lebih baik daripada menggunakan perintah REM karena label diproses sebelum simbol pengalihan. ::<remark>tidak menyebabkan masalah tetapi rem <remark>menghasilkan kesalahan.

Kalau begitu, mengapa sebagian besar panduan dan contoh yang saya lihat menggunakan REMperintah? Apakah ::berfungsi pada semua versi Windows?

MikeFHay
sumber
3
Sebagai catatan, saya pernah melihat masalah ketika "REM" digunakan untuk mengomentari garis dengan pengalihan di bawah Windows 98.
Digger
6
Sebagai tambahan, sesuai dengan komentar @ Digger: Panduan terkait adalah untuk DOS ( command.exe), bukan cmd.exe, prosesor perintah NT seperti yang ditemukan pada Windows 2000 dan seterusnya. rem <remark>berfungsi dengan baik di yang terakhir ( setidaknya Windows XP), dan REMmerupakan kendala resmi dan pilihan teraman secara keseluruhan; Meskipun ::memiliki kelebihan, itu pada akhirnya merupakan peretasan yang bermasalah di dalam (…)blok (seperti dibahas dalam banyak jawaban di sini)
mklement0
1
Jadi, situasi apa dengan REM yang menyebabkan kesalahan sebenarnya?
TS

Jawaban:

360

tl; dr: REM adalah cara yang terdokumentasi dan didukung untuk menanamkan komentar dalam file batch.


::pada dasarnya adalah label kosong yang tidak pernah bisa dilompati, sedangkan REMperintah sebenarnya yang tidak melakukan apa-apa. Dalam kedua kasus (setidaknya pada Windows 7) apakah kehadiran operator pengalihan menyebabkan masalah.

Namun, ::diketahui berperilaku tidak benar dalam blok dalam keadaan tertentu, diurai bukan sebagai label tetapi sebagai semacam huruf drive. Saya sedikit bingung di mana tepatnya tetapi itu saja sudah cukup untuk membuat saya menggunakannya REMsecara eksklusif. Ini adalah cara yang terdokumentasi dan didukung untuk menanamkan komentar dalam file batch sedangkan ::hanyalah artefak dari implementasi tertentu.


Berikut adalah contoh di mana ::menghasilkan masalah dalam satu FORlingkaran.

Contoh ini tidak akan berfungsi di file yang dipanggil test.batdi desktop Anda:

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

Sementara contoh ini akan berfungsi sebagai komentar dengan benar:

@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

Masalahnya muncul ketika mencoba mengarahkan output ke file. Dugaan terbaik saya adalah bahwa itu menafsirkan ::sebagai label yang lolos disebut :echo.

Joey
sumber
1
@Firedan: Apakah nama file batch dan lokasinya relevan (bersama dengan nama dan lokasi file yang akan diarahkan?). Kalau tidak, akan lebih baik untuk menyederhanakan contoh.
Joey
15
Sentuhan yang bagus menambahkan tl; dr
makoshichi
2
Jika ada keterlambatan penggunaan variabel, :: akan menyebabkan beberapa pesan kesalahan, mis. Tidak dapat menemukan driver disk khusus ..... Jadi, lebih baik gunakan REM.
Scott Chu
2
:: komentar diuraikan, dan karakter khusus seperti> | akhiri komentar, dan teks berikut ini tidak dikomentari.
mosh
4
@ oh benar. Misalnya, %VAR%variabel diperluas. Misalkan Anda memiliki (salah) set TARGET=C:\Program Files (x86)\"foo.exe", dan di dalam DO(..)ekspresi yang Anda miliki, :: echo %TARGET%Anda akan mendapatkan kesalahan karena (x86)diperluas sebelum seluruh ekspresi dievaluasi, mengarah ke DO(..)ekspresi yang tidak valid dan kesalahan yang sangat tidak dapat dijelaskan (dalam hal ini "\ Microsoft tidak terduga saat ini " ). Anda bahkan tidak perlu |atau >dalam ekspresi Anda. A ::bukan komentar REMyang sebenarnya.
Abel
161

Komentar dengan REM

Sebuah REMkaleng komentar garis lengkap, juga tanda garis multiline di ujung garis, jika itu bukan akhir token pertama.

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 diikuti oleh beberapa karakter .:\/=bekerja sedikit berbeda, itu tidak mengomentari tanda dan, sehingga Anda dapat menggunakannya sebagai inline comment

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

Tetapi untuk menghindari masalah dengan file yang ada seperti REM, REM.batatau REM;.bathanya varian yang dimodifikasi harus digunakan.

REM^;<space>Comment

Dan untuk karakter ;juga diperbolehkan salah satunya;,:\/=

REM sekitar 6 kali lebih lambat daripada ::(diuji pada Win7SP1 dengan 100000 baris komentar).
Untuk penggunaan normal itu tidak penting (58μs versus 360μs per baris komentar)

Komentar dengan ::

A ::selalu mengeksekusi tanda akhir baris.

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

Label dan juga label komentar :: memiliki logika khusus dalam blok kurung.
Mereka selalu span dua baris SO: perintah goto tidak berfungsi .
Jadi mereka tidak direkomendasikan untuk blok kurung, karena mereka sering menjadi penyebab kesalahan sintaksis.

Dengan ECHO ONsebuah REMgaris yang ditampilkan, tetapi bukan garis berkomentar dengan::

Keduanya tidak bisa mengomentari sisa baris, jadi yang sederhana %~akan menyebabkan kesalahan sintaksis.

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

Tetapi REM mampu menghentikan pengurai batch pada fase awal, bahkan sebelum fase karakter khusus dilakukan.

@echo ON
REM This caret ^ is visible

Anda dapat menggunakan & REM atau & :: untuk menambahkan komentar di akhir baris perintah. Pendekatan ini berhasil karena '&' memperkenalkan perintah baru pada baris yang sama.

Komentar dengan tanda persen% = komentar =%

Ada gaya komentar dengan tanda persen.

Pada kenyataannya ini adalah variabel tetapi mereka diperluas ke nol.
Tetapi keuntungannya adalah mereka dapat ditempatkan di jalur yang sama, bahkan tanpa &.
Tanda sama memastikan, bahwa variabel seperti itu tidak dapat ada.

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

Gaya persen direkomendasikan untuk makro batch, karena tidak mengubah perilaku runtime, karena komentar akan dihapus ketika makro didefinisikan.

set $test=(%\n%
%=Start of code=% ^
echo myMacro%\n%
)
jeb
sumber
2
Perlu dicatat bahwa %=komentar adalah rewel dengan tanda kutip, yaitu set foo=bar %=bazhasil dalam fooekspansi ke bar %=baz, seperti halnya set foo="bar" %=baz, sedangkan hanya set "foo=bar" %=bazmenghasilkan fooekspansi ke barsebagaimana dimaksud.
LastStar007
3
@ LastStar007: Selalu menggunakan gaya mengutip set "foo=bar"patut direkomendasikan secara umum, karena itu adalah bentuk paling kuat yang dengan jelas membatasi nilai. Masalah yang Anda gambarkan adalah melekat dalam set's perilaku, dan tidak spesifik untuk %= … =%komentar: kecuali jika Anda menggunakan "var=val"mengutip, setmenganggap segala sesuatu yang mengikuti =nilai, termasuk trailing spasi (melalui akhir baris atau, jika berlaku, awal perintah inline selanjutnya).
mklement0
28

Alternatif lain adalah dengan mengekspresikan komentar sebagai ekspansi variabel yang selalu berkembang menjadi nol.

Nama variabel tidak boleh berisi =, kecuali untuk variabel dinamis tidak berdokumen seperti
%=ExitCode%dan %=C:%. Tidak ada nama variabel yang dapat berisi =setelah posisi 1. Jadi saya kadang-kadang menggunakan yang berikut untuk memasukkan komentar di dalam tanda kurung:

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

Ini juga merupakan metode yang baik untuk menggabungkan komentar in-line

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

Memimpin =tidak perlu, tapi saya suka kalau untuk simetri.

Ada dua batasan:

1) komentar tidak dapat berisi %

2) komentar tidak dapat berisi :

dbenham
sumber
LOL! Jadikan itu salah satu variabel besar! Jenius! %=ExitCode%? Rapi. Pelajari sesuatu yang baru setiap hari!
James K
Anda menyiratkan bahwa trailing =diperlukan. Tapi sepertinya tidak.
James K
4
@JamesK - Saya menggunakan trailing =sehingga sesuatu seperti% = ExitCode =% adalah "komentar" dan bukan variabel dinamis. Saya lebih suka menggunakan gaya yang selalu berhasil (kecuali untuk batasan yang tercatat di bagian bawah tentu saja).
dbenham
Lihat stackoverflow.com/a/20169219/1689714 untuk eksplorasi variabel dinamis (misalnya% = ExitCode%% = ExitCodeAscii%% = C:%% = D:%% __ CD __% dll.), Apa artinya, bagaimana mereka diatur, dll.
Kieron Hardy
25

Setelah saya menyadari bahwa saya bisa menggunakan label ::untuk membuat komentar dan mengomentari kode REMhanya tampak jelek bagi saya. Seperti telah disebutkan, double-colon dapat menyebabkan masalah ketika digunakan di dalam ()kode yang diblokir, tetapi saya telah menemukan solusi dengan berganti-ganti antara label ::dan:space

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

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

Itu tidak jelek REM, dan sebenarnya menambahkan sedikit gaya pada kode Anda.

Jadi di luar blok kode saya gunakan ::dan di dalamnya saya bergantian antara ::dan :.

Ngomong-ngomong, untuk rongsokan besar komentar, seperti di header file batch Anda, Anda dapat menghindari perintah dan karakter khusus sepenuhnya dengan hanya gotomemeriksa komentar Anda. Ini memungkinkan Anda menggunakan metode atau gaya markup yang Anda inginkan, terlepas dari kenyataan bahwa jika CMDpernah benar-benar mencoba untuk memproses garis-garis itu akan menimbulkan desisan.

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

Gunakan notasi apa pun yang Anda inginkan *, @dll.

James K
sumber
Bagaimana Anda menangani /?sakelar untuk membuatnya mencetak menu ini?
hoang
1
@hoang setlocal ENABLEDELAYEDEXPANSION <NEWLINE> set var =% ~ 1 <NEWLINE> param pertama gema adalah% 1 <NEWLINE> JIKA! VAR! == "/?" (PENGGUNAAN GOTO) <NEWLINE>: PENGGUNAAN <NEWLINE> echo blah bla .. <NEWLINE>
GL2014
16
Colon tunggal dan ganda bergantian harus menjadi sakit kepala saat Anda memasukkan atau menghapus baris.
@ GL2014 pada dasarnya Anda mengatakan "Anda tidak mencetak menu ini ". Contoh kode Anda membutuhkan gema awalan untuk setiap baris catatan penggunaan. Jawaban James K menyesatkan sejauh itu menunjukkan ada beberapa cara untuk mencetak catatan penggunaan seperti yang tertulis.
Timbo
1
@Timbo saya menulis subrutin ( :PrintHelp) untuk jawaban ini yang memang melakukan apa yang diminta @hoang. Saya menggunakan <HELP> dan </HELP> sebagai spidol tetapi Anda dapat menggunakan apa pun yang cocok untuk Anda.
cdlvcdlv
21

Jawaban ini mencoba ringkasan pragmatis dari banyak jawaban hebat di halaman ini:

Jawaban jeb yang luar biasa patut disebutkan secara khusus, karena ia benar-benar mendalam dan mencakup banyak kasus tepi.
Khususnya, ia menunjukkan bahwa referensi variabel / parameter yang misconstructed seperti %~dapat memecah salah satu solusi di bawah ini - termasuk REMbaris .


Komentar baris penuh - satu-satunya gaya yang didukung langsung:

  • REM(atau variasi kasusnya) adalah satu - satunya konstruksi komentar resmi , dan merupakan pilihan paling aman - lihat jawaban Joey yang bermanfaat .

  • ::adalah peretasan (banyak digunakan) , yang memiliki pro dan kontra :

    • Pro :

    • Cons :

      • Di dalam (...)blok, ::dapat melanggar perintah , dan aturan untuk penggunaan yang aman bersifat membatasi dan tidak mudah diingat - lihat di bawah.

Jika kamu tidak ingin menggunakan:: , Anda memiliki pilihan ini:

  • Baik : Agar aman, buat pengecualian di dalam(...) blok dan gunakan di REMsana, atau jangan letakkan komentar di dalamnya (...) sama sekali.
  • Atau : Hafalkan aturan pembatasan menyakitkan untuk penggunaan yang aman ::di dalam(...) , yang dirangkum dalam cuplikan berikut:
@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.
)

Emulasi gaya komentar lainnya - inline dan multi-line:

Perhatikan bahwa tidak satu pun dari gaya ini didukung secara langsung oleh bahasa batch , tetapi bisa ditiru .


Komentar sebaris :

* Cuplikan kode di bawah ini digunakan versebagai pengganti untuk perintah sewenang-wenang, sehingga memudahkan eksperimen.
* Agar SETperintah berfungsi dengan benar dengan komentar sebaris, kutip ganda name=valuebagian tersebut; misalnya SET "foo=bar",. [1]

Dalam konteks ini kita dapat membedakan dua subtipe:

  • Komentar EOL ([to-the-] end-of-line), yang dapat ditempatkan setelah perintah, dan selalu meluas ke akhir baris (sekali lagi, milik jawaban jeb ):

    • ver & REM <comment> mengambil keuntungan dari kenyataan itu REM adalah perintah yang valid dan &dapat digunakan untuk menempatkan perintah tambahan setelah yang sudah ada.
    • ver & :: <comment>berfungsi juga, tetapi benar(...) - benar hanya dapat digunakan di luar blok , karena penggunaannya yang aman bahkan lebih terbatas daripada menggunakan ::mandiri.
  • Komentar intra-line , yang ditempatkan di antara beberapa perintah pada satu baris atau idealnya bahkan di dalam perintah yang diberikan.
    Komentar intra-line adalah bentuk yang paling fleksibel (single-line) dan dapat secara definisi juga digunakan sebagai komentar EOL.

    • ver & REM^. ^<comment^> & vermemungkinkan memasukkan komentar di antara perintah (sekali lagi, milik jawaban jeb ), tetapi perhatikan bagaimana <dan >perlu ^-hapus, karena karakter berikut. tidak dapat digunakan apa adanya:< > | (sedangkan unescaped &atau &&atau ||memulai perintah berikutnya ).

    • %= <comment> =%, sebagaimana dirinci dalam jawaban hebat dbenham , adalah bentuk yang paling fleksibel , karena dapat ditempatkan di dalam perintah (di antara argumen) .
      Itu mengambil keuntungan dari sintaks ekspansi variabel dengan cara yang memastikan bahwa ekspresi selalu mengembang ke string kosong - selama teks komentar tidak mengandung %atau:
      suka REM, %= <comment> =%berfungsi dengan baik baik di luar maupun di dalam (...)blok, tetapi lebih berbeda secara visual; satu-satunya kelemahan adalah lebih sulit untuk mengetik, lebih mudah mendapatkan kesalahan secara sintaksis, dan tidak banyak diketahui, yang dapat menghalangi pemahaman kode sumber yang menggunakan teknik ini.


Komentar multi-baris (blok seluruh baris) :

  • Jawaban James K menunjukkan bagaimana menggunakan gotopernyataan dan label untuk membatasi komentar multi-baris panjang dan konten yang sewenang-wenang (yang dalam kasusnya ia gunakan untuk menyimpan informasi penggunaan).

  • Jawaban Zee menunjukkan bagaimana menggunakan "label nol" untuk membuat komentar multi-baris, meskipun harus berhati-hati untuk menghentikan semua lini interior ^.

  • Posting blog Rob van der Woude menyebutkan opsi lain yang agak tidak jelas yang memungkinkan Anda untuk mengakhiri file dengan sejumlah baris komentar sewenang-wenang : Pembukaan (hanya menyebabkan segala sesuatu yang terjadi setelahnya diabaikan , asalkan tidak mengandung (non- ^-escaped) ), yaitu, selama blok tidak ditutup .


[1] Menggunakan SET "foo=bar"untuk mendefinisikan variabel - yaitu, menempatkan tanda kutip ganda di sekitar nama dan =dan nilai yang digabungkan - diperlukan dalam perintah seperti SET "foo=bar" & REM Set foo to bar., untuk memastikan bahwa apa yang mengikuti nilai variabel yang dimaksud (hingga perintah berikutnya, dalam hal ini satu ruang) tidak sengaja menjadi bagian darinya.
(Sebagai tambahan: SET foo="bar"tidak hanya tidak akan menghindari masalah, itu akan membuat tanda kutip ganda bagian dari nilai ).
Perhatikan bahwa masalah ini tidak dapat dipisahkan SETdan bahkan berlaku untuk spasi spasi trailing yang tidak disengaja mengikuti nilainya, sehingga disarankan untuk selalu menggunakan SET "foo=bar"pendekatan tersebut.

mklement0
sumber
7

Halaman ini mengatakan bahwa menggunakan "::" akan lebih cepat dalam batasan tertentu. Hanya hal yang perlu dipertimbangkan ketika memilih

mishal153
sumber
2
Ini benar, setidaknya untuk Win7SP1, ::bisa 6 kali lebih cepat daripadaREM
jeb
4

pertanyaan yang bagus ... Saya sudah lama mencari fungsi ini ...

setelah beberapa tes dan trik tampaknya solusi yang lebih baik adalah yang lebih jelas ...

-> cara terbaik yang saya temukan untuk melakukannya, mencegah integritas parser gagal, menggunakan kembali REM:

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

Anda juga dapat menggunakan multiline dengan trik "NULL LABEL" ... (jangan lupakan ^ di akhir baris untuk kesinambungan)

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

James K, saya minta maaf saya salah dalam bagian yang adil dari apa yang saya katakan. Tes yang saya lakukan adalah sebagai berikut:

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

Ini memenuhi uraian Anda tentang bergantian tetapi gagal dengan tanda ") tidak terduga pada saat ini." pesan eror.

Saya melakukan beberapa pengujian lebih jauh hari ini dan menemukan bahwa bergantian bukan kuncinya tetapi tampaknya kuncinya adalah memiliki jumlah garis genap, tidak memiliki dua garis berturut-turut dimulai dengan titik dua (: :) dan tidak berakhir dengan titik dua . Pertimbangkan yang berikut ini:

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

Ini bekerja!

Tetapi pertimbangkan juga ini:

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

Aturan memiliki jumlah genap dari komentar tampaknya tidak berlaku ketika mengakhiri perintah.

Sayangnya ini hanya cukup untuk membuat saya tidak yakin ingin menggunakannya.

Sungguh, solusi terbaik, dan teraman yang bisa saya pikirkan, adalah jika sebuah program seperti Notepad ++ akan membaca REM sebagai titik dua dan kemudian akan menulis titik dua lagi sebagai pernyataan REM ketika file disimpan. Tapi saya tidak mengetahui program seperti itu dan saya tidak mengetahui adanya plugin untuk Notepad ++ yang melakukan hal itu.

Darin
sumber
2

Diskusi yang sangat terperinci dan analitik tentang topik ini tersedia pada INI halaman

Ini memiliki kode contoh dan pro / kontra dari opsi yang berbeda.

BiLaL
sumber
1
Anda harus meringkas isi tautan yang disediakan dalam jawaban. Kalau tidak, itu disebut "hanya tautan jawaban", dan sama sekali tidak berguna jika tautan itu hilang. Dalam hal ini, halaman yang ditunjukkan agak lucu karena membuat pilihan berdasarkan mengoptimalkan kecepatan membaca file batch dari floppy disk yang lambat :)
GreenAsJade
0

Ada sejumlah cara untuk berkomentar dalam file batch

1) Menggunakan rem

Ini cara resmi. Tampaknya membutuhkan waktu lebih lama untuk dieksekusi daripada ::, meskipun tampaknya berhenti mengurai lebih awal, sebelum karat diproses. Persen ekspansi terjadi sebelum rem dan ::diidentifikasi, sehingga penggunaan persen yang salah yaitu %~akan menyebabkan kesalahan jika persen hadir. Aman digunakan di mana saja dalam blok kode.

2) Menggunakan label :, ::atau lainnya :;.

Untuk :: comment, ': komentar' adalah nama label yang tidak valid karena dimulai dengan karakter yang tidak valid. Tidak apa-apa untuk menggunakan titik dua di tengah label sekalipun. Jika spasi dimulai pada awal label, itu dihapus : labelmenjadi :label. Jika spasi atau titik dua muncul di tengah-tengah label, sisa nama tidak diartikan yang berarti bahwa jika ada dua label :f:oodan :f rr, keduanya akan ditafsirkan sebagai :fdan hanya label yang didefinisikan kemudian dalam file yang akan dilompati. Label lainnya adalah komentar yang efektif. Ada beberapa alternatif untuk ::, terdaftar di sini . Anda tidak pernah gotoatau callsebuah ::foolabel. goto :foodangoto ::foo tidak akan bekerja

Mereka bekerja dengan baik di luar blok kode tetapi setelah label di blok kode, tidak valid atau tidak, harus ada baris perintah yang valid. :: commentmemang perintah lain yang valid. Ini menafsirkannya sebagai perintah dan bukan label; perintah telah diutamakan. Yang merupakan perintah untuk cd ke ::volume, yang akan berfungsi jika Anda telah dieksekusi subst :: C:\, jika tidak Anda tidak dapat menemukan kesalahan volume. Itu sebabnya :;bisa dibilang lebih baik karena tidak dapat ditafsirkan dengan cara ini, dan karena itu ditafsirkan sebagai label, yang berfungsi sebagai perintah yang valid. Ini bukan rekursif, yaitu label berikutnya tidak perlu perintah setelahnya. Itu sebabnya mereka datang berpasangan.

Anda perlu memberikan perintah yang valid setelah label misalnya echo something. Label dalam blok kode harus datang dengan setidaknya satu perintah yang valid, sehingga garis datang berpasangan dari dua. Anda akan mendapatkan )kesalahan yang tidak terduga jika ada spasi atau tanda kurung tutup pada baris berikutnya. Jika ada spasi di antara kedua ::baris Anda akan mendapatkan kesalahan sintaks yang tidak valid.

Anda juga dapat menggunakan operator tanda sisipan di ::komentar seperti:

@echo off

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

Tetapi Anda membutuhkan jejak :;karena alasan yang disebutkan di atas.

@echo off

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

Tidak apa-apa asalkan ada bilangan genap. Ini tidak diragukan lagi cara terbaik untuk berkomentar - dengan 4 baris dan :;. Dengan :;Anda tidak mendapatkan kesalahan yang perlu ditekan menggunakan 2> nulatau subst :: C:\. Anda dapat menggunakan subst :: C:\untuk membuat kesalahan volume tidak ditemukan hilang tetapi itu berarti Anda juga harus memasukkan C: dalam kode untuk mencegah direktori kerja Anda menjadi ::\.

Untuk mengomentari akhir baris yang dapat Anda lakukan command &::atau command & rem comment, tetapi harus ada nomor genap, seperti:

@echo off

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

echo hello

Yang pertama echo hello & :;yesmemiliki perintah yang valid pada baris berikutnya tetapi yang kedua & :;yestidak, sehingga perlu satu yaitu :;.

3) Menggunakan variabel lingkungan yang tidak valid

%= comment =%. Dalam file batch, variabel lingkungan yang tidak didefinisikan dihapus dari skrip. Ini memungkinkan untuk menggunakannya di akhir baris tanpa menggunakan &. Biasanya menggunakan variabel lingkungan yang tidak valid, yaitu variabel yang berisi tanda sama dengan. Sama dengan ekstra tidak diperlukan tetapi membuatnya terlihat simetris. Selain itu, nama variabel yang dimulai dengan "=" dicadangkan untuk variabel dinamis tidak berdokumen. Variabel dinamis tersebut tidak pernah berakhir dengan "=", jadi dengan menggunakan "=" pada awal dan akhir komentar, tidak ada kemungkinan nama bentrokan. Komentar tidak dapat berisi %atau :.

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

4) Sebagai perintah, arahkan stderr ke nul

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

5) Di akhir file, segala sesuatu setelah tanda kurung tertutup adalah komentar

@echo off
(
echo hello
)

(this is a comment
this is a comment
this is a comment
Lewis Kelsey
sumber