我的计算机上有几个地方有可执行文件,它们都被添加到了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哪些文件:
- 应用程序加载的目录。
- 父进程的当前目录。
- 32 位 Windows 系统目录。使用 GetSystemDirectory 函数获取此目录的路径。
- 16 位 Windows 系统目录。没有函数可以获取此目录的路径,但会搜索该目录。此目录的名称为 System。
- Windows 目录。使用 GetWindowsDirectory 函数获取此目录的路径。
- 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
),您将看到准确的搜索顺序。对于不包含可执行文件的目录,它将报告“没有这样的文件”。