语境
在 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