如果我有一個很長且複雜的 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:\]which mspaint 目錄 mspaint 是外部的:C:\Windows\system32\mspaint.exe dir 是一個內部指令 [C:\]
- 對於 Korn shell
ksh
,如可用的SFUA 實用工具包(運行在基於 UNIX 的應用程式的子系統Windows 7 Ultimate 版和 Windows Server 2008 R2 的包裝盒中附帶)使用它的內建whence
指令。它可以理解 Korn shell 的別名、函數、內建指令等。$ 從何而來 -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) 中沒有目錄 C:\>
where
下面提到的命令以grawity
完全相同的方式失敗:C:\>所在目錄 訊息:找不到給定模式的檔案。 C:\>
答案3
如果你有GnuWin32很簡單:
which ObscureTool.exe
更好的是,如果您僅通過名稱調用它(沒有擴展名,如“ObscureTool”中),它仍然會找到正確的東西。如果您有,這可能是一個問題二“可執行”檔案:“ObscureTool.exe”和“ObscureTool.bat”。在這種情況下,哪個會找到發生的那個第一的在路徑中。在這種情況下,你只需說“
which ObscureTool
答案4
使用 powershell 您可以使用Get-Command tool.exe