Windows 的 where 实用程序是否仅搜索系统路径,而不是当前终端路径?

Windows 的 where 实用程序是否仅搜索系统路径,而不是当前终端路径?

我正在 Windows 中编写 Makefile,并尝试找到arm-none-eabi-gcc.exe系统中安装的文件夹,因此如果该文件夹发生变化,我的 Makefile 不会中断。

我尝试使用它where来获取编译器的完整路径,但我注意到一个奇怪的行为:它似乎在系统变量中搜索,而不是在当前终端 PATH 变量中搜索。它们会有所不同,因为我手动添加了安装PATH文件夹。arm-none-eabi-gcc.exe

这个想法是,Makefile 看到的 PATH 变量可能在调用它们之前由另一个脚本设置,因此系统和当前终端 PATH 可能不同。

我不使用setx是一个可能的解决方案,因为我不想永久更改系统路径,我只需要为当前 shell 添加编译器文件夹。最终用途是构建服务器,其中我们有相同工具链的不同版本,我不能将它们全部放在系统 PATH 中。

我将使用 Meld 来说明我的观点。我将 Meld 的文件夹添加到 PATH 中,如下所示:

set PATH="C:\Program Files (x86)\Meld";%PATH%

如果我打电话

C:\>meld

它确实打开了 Meld。如果我检查 PATH 变量本身:

C:\>PATH
PATH="C:\Program Files (x86)\Meld";C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;

但如果我这么做

C:\>where meld
INFO: Could not find files for the given pattern(s).

我的系统上安装了 Mingw-W64,因此我的系统路径中的一个文件夹是C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin,因此如果我输入

C:\>where gcc
C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\gcc.exe

是什么赋予了?

有没有办法where在当前 shell 的 PATH 变量中进行搜索?

要明确的是:我希望where表现得像 POSIXwhich实用程序。

谢谢。

答案1

where命令搜索当前目录和 PATH 环境变量中指定的路径。

您可以使用/R开关从以下位置开始递归搜索并显示与给定模式匹配的文件:指定的目录。使用/R开关会导致 PATH 环境变量不是正在被搜索。例如:

其中 /R c:\test *.exe

将查找其所有子目录.exe中的所有文件。它将c:\test不是搜索路径。

答案2

事实证明,这where是一个糟糕的应用程序,它对双引号过于挑剔。

如果我设置 PATH 变量时新条目周围没有双引号:

set PATH=C:\Program Files (x86)\Meld;%PATH%

然后where找到应用程序:

C:\>where meld
C:\Program Files (x86)\Meld\Meld.exe

如果进入 GUI 并添加"C:\Program Files (x86)\Meld"(注意双引号),GUI 会删除双引号。

还要注意,setx如果 PATH 变量长度超过 1024 个字符,则可能会造成破坏。setx破坏了我的系统 PATH 变量,我不得不手动恢复它。

相关内容