有没有办法反向查找正在调用的可执行文件?

有没有办法反向查找正在调用的可执行文件?

我的机器上安装了多个 JDK,并且我运行的系统具有相当长的路径环境变量。有没有办法查看我对 java 的调用解析为什么?

我正在寻找像这样工作的东西,或者可以帮助我做同样的事情:

 C:\> set path=c:\program files\java\jre1.8.0.20\bin\;%path%;
 C:\> lookup java
 java => c:\program files\java\jre1.8.0.20\bin\java.exe

 C:\> set path=c:\program files(x86)\java\jre1.8.0.20\bin\;%path%;
 C:\> lookup java
 java => c:\program files(x86)\java\jre1.8.0.20\bin\java.exe

我可能可以通过任务管理器、打开进程位置等来解决这个问题,但我希望能够将其包装到脚本中。

答案1

最简单的选择是使用 WHERE 命令 - 但是,它相当慢。默认情况下,它会列出当前目录和 PATH 目录中所有可能匹配的文件。它使用给定的参数进行搜索,还会使用附加的每个 PATEXT 扩展名进行搜索。

where java

列出的第一个文件代表将要执行的文件。此值可能会根据您当前的目录而变化。可以使用一个简单的批处理脚本来仅返回将要执行的文件。我编写了脚本以将命令作为第一个也是唯一的参数。因此,它可用于定位任何外部命令。

@echo off
for %%F in ('where "%~1"') do (
  echo %%F
  exit /b
)

假设脚本名为 WHICH1.BAT,则用法如下

which1 java

有一种更快的方法,即使用%~f$PATH:1扩展。但是,您必须知道可执行文件的扩展名。另外,它通常不会在当前目录中查找。因此,最好创建一个临时的修改后的 PATH,并在前面包含当前目录。虽然不太可能,但 PATH 中的路径之一可能包含未加引号的毒字符,因此我使用延迟扩展。但是,也存在一种不太可能的情况,即路径可能包含!,这会因延迟扩展而损坏,因此我再次禁用它。最终结果被加引号以防止毒字符。

@echo off
setlocal enableDelayedExpansion
set "modPath=.;!path!"
setlocal disableDelayedExpansion
echo "%~f$modPath:1"

如果上述脚本是 WHICH2.BAT,则用法是

which2 java.exe

所有上述脚本都无法识别内部命令。

我已经写了一个强大的WHICH.BAT 脚本在适当的时候,它将正确地将命令列为内部命令,否则它将列出将要执行的外部命令。

用法是

which java

相关内容