write - Windows批處理文件:.bat vs.cmd?
windows run bat cmd (10)
據我了解, .bat
是舊的16位命名約定, .cmd
是32位Windows,即從NT開始。 但我繼續在任何地方都看到.bat文件,而且它們似乎使用任一後綴完全相同。 假設我的代碼永遠不需要運行在比NT更早的任何東西上,那麼我命名我的批處理文件的方式真的很重要,還是有一些通過使用錯誤的後綴等待我的問題?
.cmd和.bat文件的執行方式不同,因為在.cmd錯誤級別變量中,它可以在受命令擴展影響的命令上更改。 這是真的。
RE:顯然,當command.com被調用時有點複雜的奧秘;
幾個月前,在一個項目過程中,我們必須弄清楚為什麼一些我們想在CMD.EXE下運行的程序實際上是在COMMAND.COM下運行的。 有問題的“程序”是一個非常古老的.BAT文件,每天仍在運行。
我們發現批處理文件在COMMAND.COM下運行的原因是它是從.PIF文件(也是古老的)啟動的。 由於僅通過PIF提供的特殊內存配置設置已變得無關緊要,因此我們將其替換為傳統的桌面快捷方式。
從快捷方式啟動的同一批處理文件在CMD.EXE中運行。 當你考慮它時,這是有道理的。 我們花了這麼長時間才弄明白的原因部分是因為我們忘記了它在創業小組的項目是PIF,因為它自1998年以來一直在生產。
以下是本主題中各種答案和引用參考文獻的驗證信息彙編:
-
command.com
是在MS-DOS中引入的16位命令處理器,也用於Win9x系列操作系統。 -
cmd.exe
是Windows NT中的32位命令處理器(64位Windows操作系統也具有64位版本)。cmd.exe
從來不是Windows 9x的一部分。 它起源於OS / 2版本1.0,cmd
的OS / 2版本開始16位(但它仍然是一個完全成熟的保護模式程序,其中包含start
命令)。 Windows NT從OS / 2繼承了cmd
,但Windows NT的Win32版本從32位開始。 雖然OS / 2在1992年達到了32位,但它的cmd
仍然是16位OS / 2 1.x程序。 -
ComSpec
env變量定義了由.bat
和.cmd
腳本啟動的程序。 (從WinNT開始,這默認為cmd.exe
。) -
cmd.exe
向後兼容command.com
。 - 為
cmd.exe
設計的腳本可命名為.cmd
以防止在Windows 9x上意外執行。 這個文件擴展名也可以追溯到OS / 2版本1.0和1987。
以下列出了command.com
不支持的cmd.exe
功能:
- 長文件名(超過8.3格式)
- 命令歷史
- Tab完成
- 轉義字符:
^
(用於:\ & | > < ^
) - 目錄堆棧:
PUSHD
/POPD
- 整數算術:
SET /A i+=1
- 搜索/替換/子字符串:
SET %varname:expression%
- 命令替換:
FOR /F
(之前存在,已被增強) - 函數:
CALL :label
執行順序:
如果腳本的兩個.bat和.cmd版本(test.bat,test.cmd)位於同一個文件夾中,並且您運行的腳本沒有擴展名(測試),則默認情況下該腳本的.bat版本將運行,甚至在64位Windows 7上。執行順序由PATHEXT環境變量控制。 有關更多詳細信息,請參閱命令提示符執行文件的順序 。
參考文獻:
wikipedia: 比較命令外殼
作為一名Cmd程序員,並且遍布整個網絡,你使用哪一個真正無關緊要,你可以在Windows 7上有一個.bat
程序,然後在Windows 10上運行它。但是如果你想讓它在Windows 10上,您可能無法在Windows 7上運行所有命令.cmd
完全相同,並運行完全相同的程序和代碼。
所有不同之處在於,它是同一個程序的不同名稱,只要它連接到CMD.EXE
,它就會運行相同的命令。
區別:
.cmd文件在執行前被加載到內存中。 .bat文件執行一行,讀取下一行,執行該行...
你可以在執行腳本文件時遇到這種情況,然後在執行完畢之前對其進行編輯。 蝙蝠文件將由此弄亂,但cmd文件不會。
從Mark Zbikowski本人發布的新聞組中發現 :
就CMD.EXE而言,.CMD和.BAT之間的區別是:啟用了擴展,.CMD文件中的PATH / APPEND / PROMPT / SET / ASSOC將設置ERRORLEVEL而不管錯誤。 .BAT僅在出錯時設置ERRORLEVEL。
所有在批處理中工作的應該以cmd工作; cmd為控制環境提供了一些擴展。 而且,cmd是由新的cmd解釋器執行的,因此在NTVDM模擬的16位環境下應該更快(在短文件中不明顯)並且更穩定
擴展沒有區別。 處理文件與CMD.EXE的COMMAND.COM之間略有不同
稍微偏離主題,但你有沒有考慮過Windows腳本宿主 ? 你可能會發現它更好。
這些答案有點太長,主要集中在交互使用方面。 重要的區別是:
-
.cmd
防止在非NT系統上無意執行。 -
.cmd
允許內置命令在成功時將Errorlevel更改為0。
編輯:在Windows 2000或更高版本下,命令擴展名默認處於.bat和.cmd文件中。
在2012年及以後,我推薦獨家使用.cmd
。