批处理文件(`.cmd` / `.bat`)在 Windows 上如何执行?

批处理文件(`.cmd` / `.bat`)在 Windows 上如何执行?

语境

在 Windows 上,负责打开给定文件类型(由其扩展名标识)的应用程序是使用在 中定义的文件关联(以及其他几个地方)来解析的HKEY_CLASSES_ROOT

通常,如果我想使具有给定扩展名的文件可执行,我会将其文件关联设置为首选解释程序。例如,如果我想.ps1通过调用文件在 PowerShell 中执行文件,我会添加HKEY_CLASSES_ROOT\.ps1指向某种文件类型的指针,然后在 中HKEY_CLASSES_ROOT\<filetype>\shell\open\command写入要使用的解释器和参数(例如powershell.exe "%1")。

问题

我一直以为批处理文件 ( .cmd/ .bat) 的关联方式相同。但是,检查 时HKEY_CLASSES_ROOT\cmdfile\shell\open\command,其值为"%1" %*,与文件的相同.exe。这表明批处理文件的执行是通过另一种机制处理的。

但是,与 不同.exe,您不能直接将批处理文件路径传递给CreateProcess。根据文件管理器调用批处理文件的 ProcMon 跟踪,该CreateProcess调用已cmd.exe使用批处理文件作为参数进行调用。

这让我相信批处理文件的执行是在 Win32 库代码中的某个地方处理的。对吗?

附加问题:为什么不使用标准文件关联(如.vbs默认支持的其他脚本文件)来处理批处理文件?


随机观察:只有以下文件扩展名可以通过调用来处理:,,/ "%1" %*.exe.com至少在我的计算机上).bat.cmd.pif

相关内容