Windows 如何决定运行哪个可执行文件

Windows 如何决定运行哪个可执行文件

我的计算机上有几个地方有可执行文件,它们都被添加到了PATH

偶尔,我会遇到多个同名的可执行文件,但它们的配置不同,或者执行的操作完全不同。例如,我有原生的 WindowsFIND命令,也有适用find于 Windows 的 Linux 端口。这两个命令本身都非常有用,但执行的操作却大不相同。

当我FIND从命令行执行时;默认情况下,除非我在包含 Unix 版本的目录中,否则将执行 Windows 版本。在这种情况下,这主要是我想要的,但有些情况有所不同。我知道将运行的可执行文件始终是我键入时输出的可执行文件which <executable name>

我的问题是:该可执行文件是如何被选中的?为什么 Windows 选择Git位于...\msysgit\bin\git.exe而不是位于 的那个D:\bin\git.exe?两个位置都在PATH。这是否像条目的顺序一样愚蠢PATH

答案1

Windows 首先检查当前工作目录,然后从左到右检查 PATH 变量中的每个路径,最后检查系统位置(例如 %WINDIR%)。这与 Linux 几乎完全相同,只是 Linux 不检查 PATH 之前的“。”。

答案2

Windows 将执行什么并不简单,它甚至可能取决于所使用的 API。

其中之一是创建进程W哪些文件:

  1. 应用程序加载的目录。
  2. 父进程的当前目录。
  3. 32 位 Windows 系统目录。使用 GetSystemDirectory 函数获取此目录的路径。
  4. 16 位 Windows 系统目录。没有函数可以获取此目录的路径,但会搜索该目录。此目录的名称为 System。
  5. Windows 目录。使用 GetWindowsDirectory 函数获取此目录的路径。
  6. PATH 环境变量中列出的目录。请注意,此函数不会搜索 App Paths 注册表项指定的每个应用程序路径。要将此每个应用程序路径包含在搜索序列中,请使用 ShellExecute 函数。

从 Windows Vista 开始,环境变量 %NoDefaultCurrentDirectoryInExePath% 配置是否应搜索当前目录(来源:微软)。

另外:如果您只是运行没有扩展名的命令,则环境变量 %PathExt% 用于查找可执行扩展名。(来源:微软)。

PATHEXT 变量的默认值为:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

CreateProcessW 的文本提到执行命令,但我找不到该函数如何处理路径设置的文档。

一个很好的工具可以找出可执行文件的具体搜索位置,它是SysInternals 进程监视器。设置过滤器path contains <executable>(不是<executable>.exe),您将看到准确的搜索顺序。对于不包含可执行文件的目录,它将报告“没有这样的文件”。

相关内容