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 tetapirem <remark>
menghasilkan kesalahan.
Kalau begitu, mengapa sebagian besar panduan dan contoh yang saya lihat menggunakan REM
perintah? Apakah ::
berfungsi pada semua versi Windows?
batch-file
coding-style
comments
MikeFHay
sumber
sumber
command.exe
), bukancmd.exe
, prosesor perintah NT seperti yang ditemukan pada Windows 2000 dan seterusnya.rem <remark>
berfungsi dengan baik di yang terakhir ( setidaknya Windows XP), danREM
merupakan 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)Jawaban:
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, sedangkanREM
perintah 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 menggunakannyaREM
secara 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 satuFOR
lingkaran.Contoh ini tidak akan berfungsi di file yang dipanggil
test.bat
di desktop Anda:Sementara contoh ini akan berfungsi sebagai komentar dengan benar:
Masalahnya muncul ketika mencoba mengarahkan output ke file. Dugaan terbaik saya adalah bahwa itu menafsirkan
::
sebagai label yang lolos disebut:echo
.sumber
%VAR%
variabel diperluas. Misalkan Anda memiliki (salah)set TARGET=C:\Program Files (x86)\"foo.exe"
, dan di dalamDO(..)
ekspresi yang Anda miliki,:: echo %TARGET%
Anda akan mendapatkan kesalahan karena(x86)
diperluas sebelum seluruh ekspresi dievaluasi, mengarah keDO(..)
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 komentarREM
yang sebenarnya.Komentar dengan REM
Sebuah
REM
kaleng komentar garis lengkap, juga tanda garis multiline di ujung garis, jika itu bukan akhir token pertama.REM diikuti oleh beberapa karakter
.:\/=
bekerja sedikit berbeda, itu tidak mengomentari tanda dan, sehingga Anda dapat menggunakannya sebagai inline commentTetapi untuk menghindari masalah dengan file yang ada seperti
REM
,REM.bat
atauREM;.bat
hanya varian yang dimodifikasi harus digunakan.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.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 ON
sebuahREM
garis yang ditampilkan, tetapi bukan garis berkomentar dengan::
Keduanya tidak bisa mengomentari sisa baris, jadi yang sederhana
%~
akan menyebabkan kesalahan sintaksis.Tetapi REM mampu menghentikan pengurai batch pada fase awal, bahkan sebelum fase karakter khusus dilakukan.
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.
Gaya persen direkomendasikan untuk makro batch, karena tidak mengubah perilaku runtime, karena komentar akan dihapus ketika makro didefinisikan.
sumber
%=
komentar adalah rewel dengan tanda kutip, yaituset foo=bar %=baz
hasil dalamfoo
ekspansi kebar %=baz
, seperti halnyaset foo="bar" %=baz
, sedangkan hanyaset "foo=bar" %=baz
menghasilkanfoo
ekspansi kebar
sebagaimana dimaksud.set "foo=bar"
patut direkomendasikan secara umum, karena itu adalah bentuk paling kuat yang dengan jelas membatasi nilai. Masalah yang Anda gambarkan adalah melekat dalamset
's perilaku, dan tidak spesifik untuk%= … =%
komentar: kecuali jika Anda menggunakan"var=val"
mengutip,set
menganggap segala sesuatu yang mengikuti=
nilai, termasuk trailing spasi (melalui akhir baris atau, jika berlaku, awal perintah inline selanjutnya).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:Ini juga merupakan metode yang baik untuk menggabungkan komentar in-line
Memimpin
=
tidak perlu, tapi saya suka kalau untuk simetri.Ada dua batasan:
1) komentar tidak dapat berisi
%
2) komentar tidak dapat berisi
:
sumber
%=ExitCode%
? Rapi. Pelajari sesuatu yang baru setiap hari!=
diperlukan. Tapi sepertinya tidak.=
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).Setelah saya menyadari bahwa saya bisa menggunakan label
::
untuk membuat komentar dan mengomentari kodeREM
hanya 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:
spaceItu 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
goto
memeriksa komentar Anda. Ini memungkinkan Anda menggunakan metode atau gaya markup yang Anda inginkan, terlepas dari kenyataan bahwa jikaCMD
pernah benar-benar mencoba untuk memproses garis-garis itu akan menimbulkan desisan.Gunakan notasi apa pun yang Anda inginkan
*
,@
dll.sumber
/?
sakelar untuk membuatnya mencetak menu ini?: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.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 - termasukREM
baris .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 :
(...)
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:(...)
blok dan gunakan diREM
sana, atau jangan letakkan komentar di dalamnya(...)
sama sekali.::
di dalam(...)
, yang dirangkum dalam cuplikan berikut: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
ver
sebagai pengganti untuk perintah sewenang-wenang, sehingga memudahkan eksperimen.* Agar
SET
perintah berfungsi dengan benar dengan komentar sebaris, kutip gandaname=value
bagian tersebut; misalnyaSET "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 ituREM
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^> & ver
memungkinkan 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
goto
pernyataan 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 sepertiSET "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
SET
dan bahkan berlaku untuk spasi spasi trailing yang tidak disengaja mengikuti nilainya, sehingga disarankan untuk selalu menggunakanSET "foo=bar"
pendekatan tersebut.sumber
Halaman ini mengatakan bahwa menggunakan "::" akan lebih cepat dalam batasan tertentu. Hanya hal yang perlu dipertimbangkan ketika memilih
sumber
::
bisa 6 kali lebih cepat daripadaREM
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:
Anda juga dapat menggunakan multiline dengan trik "NULL LABEL" ... (jangan lupakan ^ di akhir baris untuk kesinambungan)
sumber
James K, saya minta maaf saya salah dalam bagian yang adil dari apa yang saya katakan. Tes yang saya lakukan adalah sebagai berikut:
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:
Ini bekerja!
Tetapi pertimbangkan juga ini:
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.
sumber
Diskusi yang sangat terperinci dan analitik tentang topik ini tersedia pada INI halaman
Ini memiliki kode contoh dan pro / kontra dari opsi yang berbeda.
sumber
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: label
menjadi:label
. Jika spasi atau titik dua muncul di tengah-tengah label, sisa nama tidak diartikan yang berarti bahwa jika ada dua label:f:oo
dan:f rr
, keduanya akan ditafsirkan sebagai:f
dan 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 pernahgoto
ataucall
sebuah::foo
label.goto :foo
dangoto ::foo
tidak akan bekerjaMereka bekerja dengan baik di luar blok kode tetapi setelah label di blok kode, tidak valid atau tidak, harus ada baris perintah yang valid.
:: comment
memang 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 dieksekusisubst :: 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:Tetapi Anda membutuhkan jejak
:;
karena alasan yang disebutkan di atas.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 menggunakan2> nul
atausubst :: C:\
. Anda dapat menggunakansubst :: 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 &::
ataucommand & rem comment
, tetapi harus ada nomor genap, seperti:Yang pertama
echo hello & :;yes
memiliki perintah yang valid pada baris berikutnya tetapi yang kedua& :;yes
tidak, 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:
.4) Sebagai perintah, arahkan stderr ke nul
5) Di akhir file, segala sesuatu setelah tanda kurung tertutup adalah komentar
sumber