windows file教學 - Windows批處理文件:.bat vs .cmd?




8 Answers

Mark Zbikowski本人發布新聞組中發現

就CMD.EXE而言,.CMD和.BAT之間的區別是:啟用了擴展,.CMD文件中的PATH / APPEND / PROMPT / SET / ASSOC將設置ERRORLEVEL而不管錯誤。 .BAT僅在出錯時設置ERRORLEVEL。

file指令 batch

據我了解, .bat是舊的16位命名約定, .cmd是32位Windows,即從NT開始。 但我繼續在任何地方都看到.bat文件,而且它們似乎使用任一後綴完全相同。 假設我的代碼永遠不需要運行在比NT更早的任何東西上,那麼我命名我的批處理文件的方式真的很重要,還是有一些通過使用錯誤的後綴等待我的問題?




這些答案有點太長,主要集中在交互使用方面。 重要的區別是:

  • .cmd防止在非NT系統上無意執行。
  • .cmd允許內置命令在成功時將Errorlevel更改為0。

編輯:在Windows 2000或更高版本下,命令擴展名默認處於.bat和.cmd文件中。

在2012年及以後,我推薦獨家使用.cmd




RE:顯然,當command.com被調用時有點複雜的奧秘;

幾個月前,在一個項目過程中,我們必須弄清楚為什麼一些我們想在CMD.EXE下運行的程序實際上是在COMMAND.COM下運行的。 有問題的“程序”是一個非常古老的.BAT文件,每天仍在運行。

我們發現批處理文件在COMMAND.COM下運行的原因是它是從.PIF文件(也是古老的)啟動的。 由於僅通過PIF提供的特殊內存配置設置已變得無關緊要,因此我們將其替換為傳統的桌面快捷方式。

從快捷方式啟動的同一批處理文件在CMD.EXE中運行。 當你考慮它時,這是有道理的。 我們花了這麼長時間才弄明白的原因部分是因為我們忘記了它在創業小組的項目是PIF,因為它自1998年以來一直在生產。




儘管如此,在Windows 7上,BAT文件也有這樣的區別:如果您曾在同一個目錄中創建TEST.BAT和TEST.CMD文件,並且在該目錄中運行TEST,它將運行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>



我相信如果您將ComSpec環境變量的值更改為%SystemRoot%system32 \ cmd.exe,那麼文件擴展名是.BAT還是.CMD並不重要。 我不確定,但這甚至可能是WinXP及更高版本的默認設置。




擴展沒有區別。 處理文件與CMD.EXE的COMMAND.COM之間略有不同




這是我發現的一個區別: .cmd文件中需要 EnableDelayedExpansion
.bat文件的情況下,默認情況下是隱含的。 ( Windows 10

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

這適用於.bat但在.cmd文件的情況下始終可以found
line 2更改為以下內容使其按預期工作:

if %ERRORLEVEL% equ 0       (

最後對於.cmd文件,這可以正常工作:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...



區別:

.cmd文件在執行前被加載到內存中。 .bat文件執行一行,讀取下一行,執行該行...

你可以在執行腳本文件時遇到這種情況,然後在執行完畢之前對其進行編輯。 蝙蝠文件將由此弄亂,但cmd文件不會。




Related

windows batch-file cmd