据我所知,.bat是旧的16位命名约定,.cmd用于32位Windows,即从NT开始。但我仍然看到到处都有.bat文件,而且使用两个后缀时,它们的工作方式似乎完全相同。假设我的代码永远不需要在比NT更旧的软件上运行,那么我用哪种方式命名批处理文件真的很重要吗,或者使用错误的后缀会有什么问题等着我吗?
当前回答
由于最初的帖子是关于使用.bat或.cmd后缀的后果,所以不一定是文件中的命令。。。
.bat和.cmd之间的另一个区别是,如果存在两个具有相同文件名和两个扩展名的文件,则:
在命令行输入filename或filename.bat将运行.bat文件要运行.cmd文件,必须输入filename.cmd
其他回答
差异:
.cmd文件在执行之前会加载到内存中。bat文件执行一行,读取下一行,执行该行。。。
当您执行脚本文件,然后在执行完成之前对其进行编辑时,可能会遇到这种情况。bat文件会被这个搞砸,但cmd文件不会。
.cmd和.bat文件的执行不同,因为在.cmd错误级别变量中,它可以在受命令扩展名影响的命令上更改。这真的很重要。
以下是本主题中各种答案和引用参考资料的验证信息汇编:
command.com是MS-DOS中引入的16位命令处理器,也用于Win9x系列操作系统。cmd.exe是Windows NT中的32位命令处理器(64位Windows OS也有64位版本)。cmd.exe从未是Windows 9x的一部分。它起源于OS/2版本1.0,而OS/2版本的cmd从16位开始(但仍然是一个完全成熟的保护模式程序,具有启动等命令)。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格式)命令历史记录制表符完成转义符:^(用于:\&|><^)目录堆栈:PUSHD/POPD整数算术:SET/A i+=1搜索/替换/子字符串:SET%varname:expression%命令替换:FOR/F(以前存在,已增强)函数:CALL:标签
执行顺序:
如果.bat和.cmd版本的脚本(test.bat、test.cmd)位于同一文件夹中,并且您运行的脚本没有扩展名(test),则默认情况下,.bat版本的脚本将运行,即使在64位Windows 7上也是如此。执行顺序由PATHEXT环境变量控制。有关详细信息,请参见命令提示符执行文件的顺序。
参考文献:
命令提示符命令程序
wikipedia:命令shell的比较
由于最初的帖子是关于使用.bat或.cmd后缀的后果,所以不一定是文件中的命令。。。
.bat和.cmd之间的另一个区别是,如果存在两个具有相同文件名和两个扩展名的文件,则:
在命令行输入filename或filename.bat将运行.bat文件要运行.cmd文件,必须输入filename.cmd
我相信,如果将ComSpec环境变量的值更改为%SystemRoot%system32\cmd.exe(cmd),那么文件扩展名是.BAT还是.cmd都无关紧要。我不确定,但这甚至可能是WinXP及更高版本的默认值。
推荐文章
- 如何验证批处理文件中是否存在一个文件?
- 如何循环通过文件匹配通配符在批处理文件
- 异步运行Windows批处理文件命令
- XAMPP -端口80被PID 4的“无法打开进程”使用!12
- 为什么git在Windows下记不住我的密码
- Git克隆/拉不断冻结在“存储密钥在缓存?”
- 如何在批处理文件中请求管理员访问
- 有没有替换Windows (Visual C)的unistd.h ?
- 从Windows批处理文件设置系统环境变量?
- 在批处理文件中处理子字符串的最佳方法是什么?
- 在Sublime Text 2中使用Ctrl+D进行多个选择时,我如何跳过匹配?
- #定义WIN32_LEAN_AND_MEAN具体排除了什么?
- 如何添加一个设置路径只执行批处理文件?
- 最好的轻量级web服务器(只有静态内容)的Windows
- npm犯错!错误:EPERM:操作不允许,重命名