在 Windows 上,*.exe、*.bat、*.cmd 和 *.com 都表示可以运行的程序或 shell 脚本,只需双击即可运行。还有其他文件扩展名表示文件是可执行的吗?
编辑:当我开始一个新项目(或回到一个旧项目!)时,我经常想做的事情之一就是看看有哪些工具。在 Unix 上(我已经用了几十年),有一个执行位,所以这很简单:
find . -executable -type f
我认为在 Windows 上,它似乎对“这是可执行文件吗(以及如何执行它)”具有更复杂的机制,会有相对较少的文件扩展名可以大致达到相同的目的。
对于我当前的项目来说,*.exe *.bat *.cmd
几乎肯定足够了,但我想我会询问是否有一个权威的清单。
答案1
基本的“可执行”文件(Windows 希望通过 PATH 执行的文件)存储在名为 PATHEXT 的环境变量中。您可以从命令提示符中看到这一点:
C:\>set PATHEXT
在我的计算机上,我得到了这个(WinXP):
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1
这不是一份详尽的清单。Windows 还将执行其他文件(例如,屏幕保护程序的扩展名为 .scr,是可执行文件);Windows 还将允许执行其他文件扩展名,但上面列出的是默认可执行扩展。
答案2
在 Windows 上,哪些文件扩展名表示可执行文件?
表示什么?
我知道这个问题现在听起来可能有点令人困惑,但这个问题很重要。当我解释它为什么重要时,这个问题就会变得更加清晰。
虽然Ken White 的回答PATHEXT 变量(在命令提示符的“环境中”)是一个很好的简短答案,并且该答案可能对您有用,但答案并不完整。不完整的原因是,正确的答案因您要执行的操作而异。
例如,您可以尝试:
- 通过输入完整文件名,从“传统命令提示符”(“CMD”)运行程序
- 通过“传统命令提示符”(“CMD”)运行程序,输入基本文件名,但不输入扩展名
- 使用“传统命令提示符”(“CMD”)内置的“启动”命令
- 从 PowerShell 运行程序
- 从开始菜单上的“运行”菜单项运行程序
- 通过尝试双击以扩展名结尾的文件相关图标,从资源管理器运行程序
- 告诉 Microsoft Internet Explorer 打开下载的文件
- 使用 Microsoft Windows API 中的函数运行程序。(这是最终用户通常不会做的事情,但计算机程序员可能会这样做,因此这些信息与他们相关。)
其中一些运行程序的方法可能使用不同的方法来确定哪些文件扩展名受支持。特别是,使用 CMD 可能与使用运行菜单不同。
例如,Wes 的令人费解的博客:自定义 Windows 运行命令……注意到正在检查的不同位置,包括注册表项。
答案可能还取决于所使用的 Microsoft Windows 版本。在 Windows 10 中,我只需在命令提示符下键入 zip 文件的名称,它就会打开 Windows 资源管理器。我似乎记得这在 Windows XP 中不起作用(尽管在 Windows XP 中,我可以键入“start filename.zip”并获得同样的效果)。所以要么是我的记忆有误,要么是微软一直在尝试在较新版本的 Windows 中进行改进。(对我来说,希望是后者。)
在 Windows 10 的传统命令提示符(运行“CMD”)中,当我转到 zip 文件的位置(使用“CD”命令)并键入“filename.zip”时,文件将打开。当我转到该位置并键入“filename”(省略“.zip”文件扩展名)时,Windows 找不到该文件。但是,如果我运行“ ECHO %PATHEXT%
”,然后运行“ SET PATHEXT=%PATHEXT%;.ZIP
”(然后ECHO %PATHEXT%
再次运行“ ”,以确保获得所需的效果),那么我可以键入“filename”,命令提示符将找到 .ZIP 文件。所以,这就是 %PATHEXT% 变量的效果。
您可能能够通过运行该ASSOC
命令来查看另一个扩展列表。例如,运行该命令会显示多行输出,包括以下内容(在我的系统上)-“ .zip=CompressedFolder
”。然后,我可以通过键入“ FTYPE | FIND /I "CompressedFolder"
”来查看运行的内容。(这适用于传统命令行。PowerShell 不喜欢那些未转义的引号。)(如果您只键入“ FTYPE
”,而不输入该命令行的其余部分,您将看到更多关于其他扩展的输出。)
如果我在 Windows 10 电脑上输入“ ASSOC | FIND /C "."
”,那么我发现当我以这种方式检查文件关联时有 339 行输出。
微软知识库 162059是关于调整 Internet Explorer 打开 Office 文档的方式。
因此,询问默认可执行文件列表太模糊了。Microsoft Windows 的不同组件可能使用不同的资源,因此问题需要更具体才能得到准确的答案。
问题确实提到使用 Explorer 双击图标。要查看其使用的可执行文件列表,我相信您需要查看注册表。您可以从命令提示符运行此命令:
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts
(我不会在这里列出它们。我的 Windows 10 电脑上有 286 个。)
列出了扩展。要查看更多信息(包括有关扩展的详细信息),请执行以下操作:
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts /s
因此,正如您现在所看到的,这个看似无害的问题实际上可能是一个非常复杂的话题。我相信我已经说明了为什么问题应该非常具体,以便能够得到一个完整的答案,完全解决 Windows 的单个组件如何确定文件扩展名的问题。简而言之,对于 Windows 来说,答案不止一个,因为 Windows 有多个以不同方式运行的组件。希望我已经开始展示这一点,并指出了一些显示相关信息的其他资源。
答案3
安装程序的常见之一是.msi
。
答案4
我们需要了解低级的东西才能得到正确的认识:
创建进程A函数期望(但不要求,因为它也检查魔术签名)
.exe
或.com
(或一些深奥的东西)。对于批处理文件,他们明确指出:要运行批处理文件,必须启动命令解释器;将 lpApplicationName 设置为
cmd.exe
并将 lpCommandLine 设置为以下参数:/c
加上批处理文件的名称。但非正式情况下它可能会起作用:https://stackoverflow.com/questions/21553379/createprocess-is-able-to-execute-batch-files-but-documentation-says-the-opposit
今天
.exe
文件代表不同的类型:win16、win32、CRL,还有什么?似乎需要CreateProcessA
分析文件的魔法签名才能区分。Shell执行A定义动词:
edit
explore
find
print
runas
open
最后两个动词负责runas
根据注册表启动解释器(适用于管理员/提升权限)HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/FileExts
。对于
open
动词,你可以使用以下命令转储相关的注册表数据库:# ext => type cmd /c assoc # type => command cmd /c ftype
大多数文件类型都依赖于某些可执行解释器:
# cmd /c assoc .vbs .vbs=VBSFile # cmd /c ftype VBSFile VBSFile="%SystemRoot%\System32\WScript.exe" "%1" %*
甚至具有“奇怪的”不可执行语义:
# cmd /c assoc .ps1 .ps1=Microsoft.PowerShellScript.1 # cmd /c ftype Microsoft.PowerShellScript.1 Microsoft.PowerShellScript.1="C:\Windows\System32\notepad.exe" "%1"
在所有文件扩展名关联中,很少有标记为“可自行执行”的,从
ftype
输出来看:batfile="%1" %* cmdfile="%1" %* comfile="%1" %* exefile="%1" %* piffile="%1" %* scrfile="%1" /S
意义:
for i in batfile cmdfile comfile exefile piffile scrfile; do cmd /c assoc $i; done batfile=Windows Batch File cmdfile=Windows Command Script comfile=MS-DOS Application exefile=Application piffile=Shortcut to MS-DOS Program scrfile=Screen saver
命令解释器有自己的规则,引入
PATHEXT
环境变量,请参阅start
命令文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/start如果您运行的命令使用的第一个标记不是命令或带有扩展名的现有文件的文件路径,则
Cmd.exe
使用环境变量的值PATHEXT
来确定要查找哪些扩展名以及查找顺序。该PATHEXT
变量的默认值为.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PowerShell 中的类似逻辑https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables
$env:PATHEXT 变量包含 Windows 认为是可执行文件的文件扩展名列表。当从 PowerShell 执行具有列出的扩展名之一的脚本文件时,该脚本将在当前控制台或终端会话中运行。如果未列出文件扩展名,则脚本将在新的控制台会话中运行。
要确保另一种脚本语言的脚本在当前控制台会话中运行,请添加该脚本语言使用的文件扩展名。例如,要在当前控制台中运行 Python 脚本,请将 .py 扩展名添加到环境变量。要使 Windows 支持 .py 扩展名作为可执行文件,您必须使用CMD 命令 shell 的
ftype
和assoc
命令注册文件扩展名。PowerShell 没有直接方法来注册文件处理程序。有关更多信息,请参阅命令的文档ftype
。Windows 自带
where.exe
(流行的 Linux 的类似物which
)https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/where其中指出:如果不指定文件扩展名,则 PATHEXT 环境变量中列出的扩展名将默认附加到模式。
Win+R
接受不带.exe
或.bat
或的名称.cmd
,但对于其他类型,即使它们列在中,也需要扩展PATHEXT
!因此,您需要输入:gpedit.msc
和slmgr.vbs
,简短版本不起作用!实际上人们进行了逆向工程运行对话框,它来自
RunFileDlg
,shell32.dll
你可以自己用它调用它rundll32 shell32.dll,#61
,支持的后缀列表是.pif;.com;.exe;.bat;.lnk;.cmd
https://stackoverflow.com/questions/62386258/how-are-commands-on-run-dialog-executed其他环境(如https://en.wikipedia.org/wiki/Windows_shell或者https://en.wikipedia.org/wiki/File_Explorer)对文件扩展名的解释可能有所不同。