Seperti yang saya pahami, .bat
adalah konvensi penamaan 16-bit lama, dan .cmd
untuk Windows 32-bit, yaitu dimulai dengan NT. Tapi saya terus melihat file .bat di mana-mana, dan mereka tampaknya bekerja persis sama dengan menggunakan kedua suffix. Dengan anggapan bahwa kode saya tidak akan perlu berjalan pada sesuatu yang lebih tua dari NT, apakah benar-benar peduli ke arah mana saya menamai file batch saya, atau apakah ada beberapa gotcha yang menunggu saya dengan menggunakan akhiran yang salah?
windows
batch-file
cmd
Chris Noe
sumber
sumber
Jawaban:
Dari posting grup berita ini oleh Mark Zbikowski sendiri:
Dengan kata lain, jika ERRORLEVEL diatur ke non-0 dan kemudian Anda menjalankan salah satu dari perintah itu, ERRORLEVEL yang dihasilkan adalah:
sumber
set var=..
pernyataan. Yang aneh, karena saya menganggap itu perilaku yang diharapkan. Argumen bisa dibuat untuk keduanya. Saya akan tetap dengan file .bat. :-)DPATH /?
masih mencantumkan perintah LAMPIRAN. Juga, artikel Wiki sejak itu sebagian besar telah diperbaiki, kecuali itu tidak mencantumkan DPATH.Berikut ini adalah kompilasi informasi yang diverifikasi dari berbagai jawaban dan referensi yang dikutip di utas ini:
command.com
adalah prosesor perintah 16-bit yang diperkenalkan dalam MS-DOS dan juga digunakan dalam seri sistem operasi Win9x.cmd.exe
adalah prosesor perintah 32-bit di Windows NT (OS Windows 64-bit juga memiliki versi 64-bit).cmd.exe
tidak pernah menjadi bagian dari Windows 9x. Ini berasal di OS / 2 versi 1.0, dan versi OS / 2cmd
mulai 16-bit (tetapi tetap program mode terlindungi sepenuhnya dengan perintah sepertistart
). Windows NT diwarisicmd
dari OS / 2, tetapi versi Windows NT Win32 dimulai dari 32-bit. Meskipun OS / 2 berjalan 32-bit pada tahun 1992, itucmd
tetap merupakan program 16-bit OS / 2 1.x.ComSpec
variabel env mendefinisikan mana program diluncurkan oleh.bat
dan.cmd
skrip. (Dimulai dengan WinNT default ini kecmd.exe
.)cmd.exe
kompatibel dengancommand.com
.cmd.exe
dapat dinamai.cmd
untuk mencegah eksekusi yang tidak disengaja pada Windows 9x. Ekstensi nama file ini juga sudah ada sejak OS / 2 versi 1.0 dan 1987.Berikut adalah daftar
cmd.exe
fitur yang tidak didukung olehcommand.com
:^
(Gunakan untuk\ & | > < ^
:)PUSHD
/POPD
SET /A i+=1
SET %varname:expression%
FOR /F
(ada sebelumnya, telah ditingkatkan)CALL :label
Perintah Eksekusi:
Jika kedua versi .bat dan .cmd dari skrip (test.bat, test.cmd) berada di folder yang sama dan Anda menjalankan skrip tanpa ekstensi (tes), secara default versi .bat dari skrip akan berjalan, bahkan pada 64-bit Windows 7. Urutan eksekusi dikendalikan oleh variabel lingkungan PATHEXT. Lihat Urutan di mana Prompt Perintah mengeksekusi file untuk detail lebih lanjut.
Referensi:
wikipedia: Perbandingan shell perintah
sumber
dir filename
sama dengandir filename.*
di command.com; wild-card diperlukan di cmd.exe. Dalam command.comrem Create an empty file > empty.txt
berfungsi; tidak dalam cmd.exe.Jawaban ini agak terlalu panjang dan fokus pada penggunaan interaktif. Perbedaan penting untuk skrip adalah:
.cmd
mencegah eksekusi yang tidak disengaja pada sistem non-NT..cmd
memungkinkan perintah bawaan untuk mengubah Errorlevel menjadi 0 saat berhasil.Tidak semenarik itu, kan?
Dulu ada sejumlah fitur tambahan yang diaktifkan dalam
.cmd
file, yang disebut Command Extensions. Namun, mereka sekarang diaktifkan secara default untuk keduanya.bat
dan.cmd
file di bawah Windows 2000 dan yang lebih baru.Intinya: pada 2012 dan selanjutnya, saya sarankan menggunakan
.cmd
secara eksklusif.sumber
Tidak - tidak masalah sedikitpun. Pada NT ekstensi .bat dan .cmd menyebabkan prosesor cmd.exe memproses file dengan cara yang persis sama.
Informasi menarik tambahan tentang command.com vs. cmd.exe pada sistem kelas WinNT dari MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):
sumber
command /c ver
versus memulai command.com dan mengetik ver.RE: Rupanya ketika command.com dipanggil adalah sedikit misteri yang kompleks;
Beberapa bulan yang lalu, selama proyek berlangsung, kami harus mencari tahu mengapa beberapa program yang ingin kami jalankan di bawah CMD.EXE, pada kenyataannya, berjalan di bawah COMMAND.COM. "Program" yang dimaksud adalah file .BAT yang sangat lama, yang masih berjalan setiap hari.
Kami menemukan bahwa alasan file batch dijalankan di bawah COMMAND.COM adalah karena file tersebut dimulai dari file .PIF (juga kuno). Karena pengaturan konfigurasi memori khusus yang hanya tersedia melalui PIF menjadi tidak relevan, kami menggantinya dengan pintasan desktop konvensional.
File batch yang sama, diluncurkan dari shortcut, berjalan di CMD.EXE. Ketika Anda memikirkannya, ini masuk akal. Alasan mengapa kami membutuhkan waktu lama untuk mengetahuinya adalah sebagian karena fakta bahwa kami telah lupa bahwa itemnya di grup startup adalah PIF, karena sudah diproduksi sejak tahun 1998.
sumber
Namun, pada Windows 7, file BAT juga memiliki perbedaan ini: Jika Anda pernah membuat file TEST.BAT dan TEST.CMD di direktori yang sama, dan Anda menjalankan TEST di direktori itu, itu akan menjalankan file BAT.
sumber
PATHEXT
variabel ekstensi .BAT ditempatkan sebelum .CMD satu (seperti yang ditunjukkan dalam jawaban ini). Jika Anda memodifikasi pesanan ini di PATHEXT, test.cmd akan dieksekusi sebagai gantinya.PATH
variabel lingkungan terlepas dari ekstensi.Karena posting asli mengenai konsekuensi penggunaan akhiran .bat atau .cmd , belum tentu perintah di dalam file ...
Satu perbedaan lain antara .bat dan .cmd adalah jika ada dua file dengan nama file yang sama dan kedua ekstensi itu, maka:
memasukkan nama file atau nama file .bat pada baris perintah akan menjalankan file .bat
untuk menjalankan file .cmd, Anda harus memasukkan nama file .cmd
sumber
PATHEXT
variabel lingkungan. Urutan di mana ekstensi muncul ada urutan diutamakan jika ekstensi tidak ditentukan. Perlu disebutkan juga bahwa tidak perlu menentukan ekstensi untuk file yang ekstensi tersebut muncul dalam variabel env.segala sesuatu yang bekerja dalam batch harus bekerja dalam cmd; cmd menyediakan beberapa ekstensi untuk mengendalikan lingkungan. juga, cmd dieksekusi oleh interpreter cmd baru dan karenanya harus lebih cepat (tidak terlihat pada file pendek) dan lebih stabil saat kelelawar berjalan di bawah lingkungan 16bit emulasi NTVDM
sumber
.bat
tidak berjalan di bawah DOS di NT. VDM hanya dimulai jika suatu program membutuhkannya, dan bahkan tidak didukung di Windows 64bit, meskipun saya percaya .bat.Eksekusi file .cmd dan .bat berbeda karena dalam variabel tingkat kesalahan .cmd dapat berubah pada perintah yang dipengaruhi oleh ekstensi perintah. Benar-benar tentang hal itu.
sumber
@echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
Saya percaya jika Anda mengubah nilai variabel lingkungan ComSpec ke
%SystemRoot%system32\cmd.exe
(CMD) maka tidak masalah jika ekstensi file adalah.BAT
atau.CMD
. Saya tidak yakin, tetapi ini bahkan mungkin default untuk WinXP dan di atasnya.sumber
Sedikit keluar dari topik, tetapi apakah Anda sudah mempertimbangkan Windows Scripting Host ? Anda mungkin merasa lebih baik.
sumber
Ekstensi tidak ada bedanya.
Ada sedikit perbedaan antara
COMMAND.COM
penanganan file vsCMD.EXE
.sumber
sebuah perbedaan:
File .cmd dimuat ke dalam memori sebelum dieksekusi. File .bat menjalankan sebuah baris, baca baris berikutnya, jalankan baris itu ...
Anda dapat menemukan ini ketika Anda menjalankan file skrip dan kemudian mengeditnya sebelum selesai dieksekusi. file bat akan dikacaukan oleh ini, tetapi file cmd tidak akan.
sumber
.btm
file ("batch to memory") yang digunakan dengan juru bahasa pengganti perintah JP Software .echo 1&pause
kemudian jalankan. Anda akan melihat1
danPress any key to continue...
. Sementara berhenti menambahkan baris baruecho 2&pause
dengan editor eksternal. Tekan satu tombol. Anda akan melihat2
danPress any key to continue...
. Anda bahkan dapat mencoba menambahkanecho 3&pause
di awal. Ketika Anda menekan tombol setelah itu lagi Anda akan melihat2
.