File kumpulan Windows: .bat vs .cmd?

747

Seperti yang saya pahami, .batadalah konvensi penamaan 16-bit lama, dan .cmduntuk 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?

Chris Noe
sumber
19
Hanya untuk menambah kebingungan kita sekarang memiliki file .ps1 juga.
Martin Brown
42
jika saya tidak salah file .ps1 harus menjadi file Power Shell windows. Saya bisa saja salah.
CMS_95

Jawaban:

454

Dari posting grup berita ini oleh Mark Zbikowski sendiri:

Perbedaan antara .CMD dan .BAT sejauh menyangkut CMD.EXE adalah: Dengan ekstensi diaktifkan, PATH / APPEND / PROMPT / SET / ASSOC dalam file .CMD akan mengatur ERRORLEVEL terlepas dari kesalahan. .BAT menetapkan ERRORLEVEL hanya pada kesalahan.

Dengan kata lain, jika ERRORLEVEL diatur ke non-0 dan kemudian Anda menjalankan salah satu dari perintah itu, ERRORLEVEL yang dihasilkan adalah:

  • dibiarkan sendirian pada nilai non-0 dalam file bat
  • atur ulang ke 0 dalam file .cmd.
Ben Hoffstein
sumber
4
Apakah itu menyiratkan bahwa menggunakan skrip .bat tidak akan mengembalikan nilai ERRORLEVEL 0 pada kesuksesan? Jika itu benar, saya tidak pernah menyadarinya.
djangofan
31
Saya pikir itu berarti bahwa jika ERRORLEVEL diatur ke non-0, maka Anda menjalankan salah satu dari perintah itu, itu akan dibiarkan sendiri (non-0) dalam file .bat tetapi reset ke 0 dalam file .cmd. Tapi, Windows menjadi seperti itu, sangat mungkin itu benar-benar menyebabkan suara tanpa tubuh memberi tahu Anda, dalam Pig Latin, "reset ERRORLEVEL diri Anda jika Anda sangat peduli!".
MadScientist
5
Saya pikir itu mengatakan hanya perintah-perintah khusus yang akan melakukan tindakan set / tidak set yang berbeda. Yang lain akan bekerja seperti biasa
PsychoData
1
Saya mengerti sekarang. Saya memperbarui inti saya. Rupanya, itu tidak mengatur tingkat kesalahan saat memanggil set var=..pernyataan. Yang aneh, karena saya menganggap itu perilaku yang diharapkan. Argumen bisa dibuat untuk keduanya. Saya akan tetap dengan file .bat. :-)
wasatchwizard
1
Catatan - Perintah LAMPIRAN telah diganti dengan perintah DPATH tidak berdokumen, meskipun DPATH /?masih mencantumkan perintah LAMPIRAN. Juga, artikel Wiki sejak itu sebagian besar telah diperbaiki, kecuali itu tidak mencantumkan DPATH.
dbenham
417

Berikut ini adalah kompilasi informasi yang diverifikasi dari berbagai jawaban dan referensi yang dikutip di utas ini:

  1. command.com adalah prosesor perintah 16-bit yang diperkenalkan dalam MS-DOS dan juga digunakan dalam seri sistem operasi Win9x.
  2. cmd.exeadalah prosesor perintah 32-bit di Windows NT (OS Windows 64-bit juga memiliki versi 64-bit). cmd.exetidak pernah menjadi bagian dari Windows 9x. Ini berasal di OS / 2 versi 1.0, dan versi OS / 2 cmdmulai 16-bit (tetapi tetap program mode terlindungi sepenuhnya dengan perintah seperti start). Windows NT diwarisi cmddari OS / 2, tetapi versi Windows NT Win32 dimulai dari 32-bit. Meskipun OS / 2 berjalan 32-bit pada tahun 1992, itu cmdtetap merupakan program 16-bit OS / 2 1.x.
  3. The ComSpecvariabel env mendefinisikan mana program diluncurkan oleh .batdan .cmdskrip. (Dimulai dengan WinNT default ini ke cmd.exe.)
  4. cmd.exekompatibel dengan command.com.
  5. Sebuah skrip yang dirancang untuk cmd.exedapat dinamai .cmduntuk 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.exefitur yang tidak didukung oleh command.com:

  • Nama file panjang (melebihi format 8.3)
  • Sejarah perintah
  • Tab selesai
  • Karakter melarikan diri: ^(Gunakan untuk \ & | > < ^:)
  • Tumpukan direktori: PUSHD/POPD
  • Aritmatika bilangan bulat: SET /A i+=1
  • Cari / Ganti / Substring: SET %varname:expression%
  • Substitusi perintah: FOR /F(ada sebelumnya, telah ditingkatkan)
  • Fungsi: 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

Chris Noe
sumber
4
Beberapa poin minor: 1) .bat tidak selalu memanggil command.com - tampaknya ketika command.com dipanggil adalah sedikit misteri yang kompleks; 2) command.com diperkenalkan dengan MS-DOS; 3) cmd.exe dapat menjalankan sebagian besar skrip command.com, tetapi ada beberapa hal command.com kecil yang tidak berfungsi di cmd.
Michael Burr
6
cmd.exe diperkenalkan dengan NT 4.0 Saya percaya, bukan windows 95.
FlySwat
1
Chris: lihat versi artikel Wikipedia saat ini, esp. komentar oleh Mark Zbikowski di groups.google.com/group/…
Mark
2
Hanya dengan menambahkan beberapa info tentang masalah ini: dir filenamesama dengan dir filename.*di command.com; wild-card diperlukan di cmd.exe. Dalam command.com rem Create an empty file > empty.txtberfungsi; tidak dalam cmd.exe.
Aacini
2
Hanya sedikit dari ini yang tampaknya relevan dengan pertanyaan OP, yaitu tentang perbedaan antara .bat dan .cmd, bukan perbedaan antara command.com dan cmd.exe. Ketika saya membacanya, pertanyaannya adalah tentang perbedaan antara file .bat dan file .cmd, semua hal lain dianggap sama.
Stewart
85

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 .cmdfile, yang disebut Command Extensions. Namun, mereka sekarang diaktifkan secara default untuk keduanya .batdan .cmdfile di bawah Windows 2000 dan yang lebih baru.

Intinya: pada 2012 dan selanjutnya, saya sarankan menggunakan .cmdsecara eksklusif.

Gringo Suave
sumber
7
IMO, itulah poin utamanya. Anda menggunakan .cmd sebagai ekstensi untuk skrip yang lebih baru ketika Anda ingin memastikan mereka tidak dieksekusi pada OS 16-bit yang lebih lama, atau jika Anda tidak yakin mereka akan bekerja.
Oliver
12
Saya benar-benar menghargai jawaban yang singkat, pragmatis, dan jelas atas berton-ton tembok jawaban yang tidak berguna, seperti universitas.
Liquid Core
7
Saya profesor universitas dan saya setuju dengan @Liquid Core! Jawaban singkat, pragmatis, dan jelas adalah bagaimana kita belajar (ketika kita belum tahu sesuatu). Kemudian, entah bagaimana, begitu kita memahaminya, kita merasakan dorongan untuk menjelaskannya secara abstrak dan tidak bisa dipahami. Aneh. Pengamatan yang bagus!
Eureka
24

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

Perilaku ini mengungkapkan fitur Windows NT yang sangat halus yang sangat penting. Shell MS-DOS 16-bit (COMMAND.COM) yang dikirimkan bersama Windows NT dirancang khusus untuk Windows NT. Ketika sebuah perintah dimasukkan untuk dieksekusi oleh shell ini, itu sebenarnya tidak mengeksekusi itu. Sebagai gantinya, ia mengemas teks perintah dan mengirimkannya ke shell perintah CMD.EXE 32-bit untuk dieksekusi. Karena semua perintah sebenarnya dijalankan oleh CMD.EXE (shell perintah Windows NT), shell 16-bit mewarisi semua fitur dan fasilitas dari shell Windows NT lengkap.

Michael Burr
sumber
5
Itu mungkin penting; karena teks tautan Anda menyebutkan perbedaannya halus.
Gringo Suave
Anda bisa memaksa command.com untuk menjalankan perintah dos dengan menetapkannya di baris perintah. Lihat command /c verversus memulai command.com dan mengetik ver.
phd443322
Nama penting: D Melihat banyak .bat dari cowok berasal dari masa lalu! Gunakan .cmd! Juga tidak dapat percaya bahwa NT masih digunakan sampai sekarang ...
hfrmobile
@ hfrmobile: Ketika saya menyebutkan 'NT' saya maksudkan pada dasarnya semua versi Windows yang kami berbasiskan pada NT (dan bukan 9x). Jadi intinya NT, Win2k, dan semua versi Windows untuk desktop atau server sejak XP. Dan nama file dapat memberikan wawasan ke dalam pola pikir dan gaya pengkodean orang yang menulis file, tetapi sejauh penerjemah tidak ada perbedaan.
Michael Burr
16

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.

David Gray
sumber
1
OS apa ini? Sesuatu sebelum XP?
phk
14

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.

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>
tvCa
sumber
Itu karena test.bat abjad sebelum test.cmd. Windows melakukan penyelesaian serakah.
David
26
@ David: Tidak benar. Ini terjadi karena dalam PATHEXTvariabel 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.
Aacini
Hmm, saya berharap mereka berada di urutan lain; Saya kira MS pasti telah menemukan (atau berasumsi) bahwa beberapa perangkat lunak yang ada mengirimkan file CMCM dan file .BAT dengan nama yang sama, di mana file .CMD tentu saja tidak dimaksudkan sebagai input untuk cmd (yang belum dikirim). exe, tetapi bisa berupa sejumlah hal lain: perintah untuk beberapa shell lain , skrip konfigurasi yang dibaca oleh aplikasi, atau semacam biner aplikasi, misalnya. (Setidaknya, itulah pemahaman saya tentang cara MS yang biasa berakhir dengan perilaku yang tampaknya kurang optimal.)
SamB
Perlu juga dicatat bahwa direktori saat ini datang sebelum direktori lain dalam PATHvariabel lingkungan terlepas dari ekstensi.
Turkeyphant
13

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

Rob di TVSeries.com
sumber
2
Eh? Jika saya meletakkan file cmd di dir saya, saya tidak perlu menentukan ekstensi file untuk memintanya. Contoh: echo notepad.exe% *> np.cmd Lalu jika saya cukup mengetik "np mytextfilename.txt" itu akan memunculkan notepad. Saya tidak perlu mengetikkan "np.cmd" untuk memintanya.
Jon Davis
2
@ stimpy77: Ini benar jika np.cmd adalah satu-satunya file dengan nama itu, tetapi "jika ada dua file dengan nama file yang sama dan kedua ekstensi itu" , maka satu-satunya cara untuk menjalankan file .cmd adalah termasuk ekstensi. ..
Aacini
1
Ini adalah keharusan untuk menyelesaikan ambiguitas untuk shell apa pun, tidak ada hubungannya dengan perbedaan teknis antara .cmd vs .bat. Mungkin karena filename.bat mendahului filename.cmd menurut abjad.
Jon Davis
6
Ini sebenarnya tergantung pada PATHEXTvariabel 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.
Ricardo Zorio
8

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

Lorenzo Boccaccia
sumber
Seharusnya tidak membuat perbedaan dalam kecepatan. .battidak berjalan di bawah DOS di NT. VDM hanya dimulai jika suatu program membutuhkannya, dan bahkan tidak didukung di Windows 64bit, meskipun saya percaya .bat.
Gringo Suave
3

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.

zask
sumber
Tentu kasar ^. ^ Ada perbedaan dalam bahasa perintah yang digunakan untuk masing-masing (file .bat mendapatkan versi kompatibilitas). Beberapa di antaranya dapat diilustrasikan oleh skrip ini dari sini: @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
zask
4
Dalam file .cmd setiap perintah menetapkan tingkat kesalahan, dalam file .bat beberapa perintah membiarkan tingkat kesalahan tidak berubah, seperti dijelaskan dalam jawaban yang diterima
jeb
1
BAT dibuat untuk berinteraksi dengan COMMAND.COM, juru bahasa perintah DOS. Microsoft mengadopsi sebagian besar perintah DOS ke juru bahasa baru mereka bernama CMD. EXE. CMD dibuat untuk berinteraksi dengan CMD.EXE dan itu merusak kompatibilitas dengan COMMAND.COM. terutama dikenal untuk bagaimana mereka menangani variabel tingkat kesalahan. Saat menggunakan BAT, variabel ini hanya diubah setelah kesalahan aktual terjadi dan tidak ada perubahan status terjadi ketika setiap perintah dieksekusi dengan sukses. Ini tidak benar untuk CMD karena variabel tingkat kesalahan akan tetap berubah bahkan jika tidak ada kesalahan terjadi.
zask
3

Saya percaya jika Anda mengubah nilai variabel lingkungan ComSpec ke %SystemRoot%system32\cmd.exe(CMD) maka tidak masalah jika ekstensi file adalah .BATatau .CMD. Saya tidak yakin, tetapi ini bahkan mungkin default untuk WinXP dan di atasnya.

Patrick Cuff
sumber
1

Sedikit keluar dari topik, tetapi apakah Anda sudah mempertimbangkan Windows Scripting Host ? Anda mungkin merasa lebih baik.

Marcin
sumber
13
Untuk hal ini, PowerShell, yang mencela WSH / cscript.exe.
Jon Davis
3
@ stimpy77 Benar, meskipun PowerShell tampaknya cukup buruk bagi saya.
Marcin
2
Saya menemukan WSH jauh lebih buruk. Saya kira itu semua tergantung pada apa yang kita ukur untuk "mengerikan". PowerShell memiliki waktu startup yang mengerikan. Segala sesuatu tentang itu adalah IMO yang benar-benar indah.
Jon Davis
Maafkan pemformatan, tetapi untuk mempercepat waktu startup PSH, coba jalankan: Set-Alias ​​ngen @ (dir (gabung-path $ {env: \ windir} "Microsoft.NET \ Framework") ngen.exe -recurse | sort -descending lastwritetime) [0] .fullName [BARIS BARU DI SINI] [appdomain] :: currentdomain.getassemblies () | % {ngen $ _. location}
mjbnz
1
Benar-benar di luar topik.
HappyDog
1

Ekstensi tidak ada bedanya.

Ada sedikit perbedaan antara COMMAND.COMpenanganan file vs CMD.EXE.

Waldo
sumber
-10

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.

Abu-abu
sumber
Seperti yang telah ditetapkan, variabel ComSpec env mendefinisikan program mana yang diluncurkan, apakah Anda pada dasarnya mengatakan bahwa command.com membaca file satu baris pada satu waktu, sementara cmd.exe melakukan pre-load file ke dalam memori? Bisakah Anda mengutip referensi tentang ini?
Chris Noe
24
Itu salah untuk Vista dan XP, kedua jenis file dibaca baris demi baris. Jika Anda menjeda file .cmd atau .bat dan mengeditnya, kode baru akan dieksekusi
jeb
1
Orang dapat memperdebatkan apakah itu baris per baris, karena jika Anda menghentikan eksekusi di tengah file perintah dan menambahkan karakter di awal, setelah melanjutkan parser akan dimatikan oleh satu karakter, mungkin membuang sisa skrip Anda.
2
Anda tidak boleh berdebat .bat dan .cmd tidak berbeda dengan cara itu. Keduanya selalu dibaca baris demi baris. Anda dapat mengujinya jika Anda tidak percaya. Buat file batch yang echo 1&pausekemudian jalankan. Anda akan melihat 1dan Press any key to continue.... Sementara berhenti menambahkan baris baru echo 2&pausedengan editor eksternal. Tekan satu tombol. Anda akan melihat 2dan Press any key to continue.... Anda bahkan dapat mencoba menambahkan echo 3&pausedi awal. Ketika Anda menekan tombol setelah itu lagi Anda akan melihat 2.
Venimus