如果我有一个很长且复杂的 PATH,并且我输入了某个命令的名称,我该如何找出 EXE 或 BAT 文件的实际位置。我以为 TRUENAME 可以做到这一点,但它已从 XP 中消失,我不确定它是否完全满足了我的要求。
所以我希望能够输入
WHEREIS "Obscure Tool.exe"
我得到:
C:\Program Files\Obscure Tools Limited\Obscure Tool\Obscure Tool.exe
当文件夹C:\Program Files\Obscure Tools Limited\Obscure Tool\
位于我的路径上时。WHEREIS 叫什么,或者可以用批处理文件完成吗?
答案1
这是一个 Windows 批处理文件,它将在您的路径中搜索文件。我已经在 XP 和 Win7 上对其进行了测试。
请理解,批处理/命令文件并不是解决这个问题的好办法,因为字符串操作非常慢 - 但代替编译工具,它可以完成您想要的操作。
希望它得到足够好的评论,但如果有任何需要澄清的地方,请随时提问。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
rem -- SRC = Search value. Eg. notepad or notepad.exe
rem -- PAT = A copy of the path
rem -- SEP = PATH seperator
rem -- EXE = Executable file extensions
SET TMP_SRC=%1
SET TMP_PAT=%PATH%
SET TMP_SEP=;
SET TMP_EXE=exe com bat cmd
rem -- This is a batch file ...they are s-l-o-w
rem -- "<nul set /p=" does "echo" without a newline
<nul set /p =Searching...
:strLoop
rem -- SUB = The first entry in the current PATH
for /f "delims=%TMP_SEP%" %%s in ("!TMP_PAT!") do set TMP_SUB=%%s
rem -- Progress update
<nul set /p =.
rem -- Check for the file exactly as specified on the command line
if exist "!TMP_SUB!\%TMP_SRC%" (
echo.
echo Found "!TMP_SUB!\%TMP_SRC%"
goto strDone
)
rem -- Check for the file with each of the selected executable extensions
for %%x in (%TMP_EXE%) do (
if exist "!TMP_SUB!\%TMP_SRC%.%%x" (
echo.
echo Found "!TMP_SUB!\%TMP_SRC%.%%x"
goto strDone
)
)
rem -- This loop chops off the first entry of the PATH
:subLoop
rem -- CHR = First character of current PATH
rem -- PAT -> All but the first character of the current PATH
set TMP_CHR=!TMP_PAT:~0,1!
set TMP_PAT=!TMP_PAT:~1!
rem -- Have we exhausted the PATH?
if "!TMP_PAT!" EQU "" goto strDone
rem -- Have we just removed a PATH seperator?
if "!TMP_CHR!" EQU "%TMP_SEP%" goto strLoop
rem -- Keep stripping characters
goto subLoop
:strDone
rem -- Cleanup
SET TMP_SRC=
SET TMP_PAT=
SET TMP_SEP=
SET TMP_SUB=
SET TMP_CHR=
SET TMP_EXE=
ENDLOCAL
答案2
这完全取决于正在运行的命令解释器,并且没有一个外部实用程序可以在所有情况下正确执行此操作。这是出于一个非常重要的原因:
不同的命令解释器以不同的方式查找命令。只有每个单独的命令解释器内置的命令才能真正知道特定命令名称将调用什么。
- 为了JP Software 的 TCC,只需使用其内置
which
命令. 这了解了TCC的别名,可执行扩展,以及路径搜索算法。[c:\]哪个 mspaint 目录 mspaint 是外部的:C:\Windows\system32\mspaint.exe dir 是一个内部命令 [C:\]
- 对于 Korn shell
ksh
,可在SFUA 实用工具包(运行于基于 UNIX 的应用程序子系统(Windows 7 旗舰版和 Windows Server 2008 R2 包装盒内自带)使用其内置whence
命令. 这可以理解 Korn shell 的别名、函数、内置命令等等。$ whence -v ls ls 是 /bin/ls 的跟踪别名 $
- 对于 Bourne-Again shell
bash
,作为适用于 Unix 应用程序服务以及在 Cygwin 中,使用其内置type
命令。这可以理解 Boune-Again shell 的别名、函数、内置命令等。$ 类型'[' [ 是 shell 的内置命令 $
- 对于微软的命令解释器
cmd
,你运气不好。没有内置命令可以做到这一点;尽管你可以使用外部的复制路径搜索算法的命令,这些命令不一定(甚至通常)识别别名和内置命令。例如:这是 GnuWin32which
命令失败识别dir
(与上面的TCC内置which
命令相反):C:\>哪个目录 其中: (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) 中没有目录 目录:\>
where
下面提到的命令以grawity
完全相同的方式失败:C:\>其中目录 信息:无法找到给定模式的文件。 目录:\>
答案3
如果你有操作系统它很简单:
which ObscureTool.exe
更好的是,如果您仅通过名称调用它(没有扩展名,例如“ObscureTool”),它仍会找到正确的内容。如果您有二“可执行”文件:“ObscureTool.exe”和“ObscureTool.bat”。在本例中,哪个将会找到发生的第一的在路径中。在这种情况下,你只需要说“
which ObscureTool
答案4
使用 powershell 您可以使用Get-Command tool.exe