Если у меня длинный и запутанный 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
Все зависит от того, какой командный интерпретатор запущен, и нет внешней утилиты, которая будет делать это правильно во всех случаях. Это по очень важной причине:
Разные интерпретаторы команд ищут команды по-разному.Только команда, встроенная в каждый отдельный интерпретатор команд, будет точно знать, что будет вызвано конкретным именем команды.
- ДляTCC от JP Software, просто используйтеего встроенная
which
команда. Он понимает псевдонимы TCC, исполняемые расширения и алгоритм поиска пути.[c:\]какой каталог mspaint mspaint — это внешний файл: C:\Windows\system32\mspaint.exe dir — внутренняя команда [с:\]
- Для оболочки Korn,
ksh
,как доступно вНабор утилит SFUA(которые работают вПодсистема для приложений на базе UNIXкоторый идет в комплекте с Windows 7 Ultimate Edition и Windows Server 2008 R2) используйтеего встроеннаяwhence
команда. Понимает псевдонимы, функции, встроенные команды оболочки Korn и т. д.$ откуда -v ls ls — отслеживаемый псевдоним для /bin/ls $
- Для оболочки Bourne-Again,
bash
,какдоступно для служб для приложений Unixа также в Cygwin, используйте его встроеннуюtype
команду. Это понимает псевдонимы, функции, встроенные команды оболочки Boune-Again и т. д.$ тип '[' [ — встроенная оболочка $
- Для интерпретатора команд Microsoft
cmd
,вам не повезло. Для этого нет встроенной команды; и хотя можно использоватьвнешнийкоманды, которые будут копировать алгоритм поиска пути, эти команды не обязательно (или даже обычно) будут распознавать псевдонимы и встроенные команды. Например: Вот командаwhich
GnuWin32провалдля распознаванияdir
(в отличие от встроеннойwhich
команды TCC выше):C:\>какой каталог где: нет каталога в (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) С:\>
А вотwhere
команда, упомянутаяgrawity
ниже, не срабатывает точно так же:C:\>где каталог ИНФОРМАЦИЯ: Не удалось найти файлы для указанного шаблона(ов). С:\>
решение3
Если у вас естьGnuWin32это так же просто как:
which ObscureTool.exe
Еще лучше, если вы вызываете его только по имени (без расширения, как в "ObscureTool"), он все равно найдет нужную вещь. Это может быть проблемой, если у вас естьдва"исполняемые" файлы: "ObscureTool.exe" и "ObscureTool.bat". В этом случае,КОТОРЫЙнайдут тот, который происходитпервыйв пути. В этом случае вы бы просто сказали: "
which ObscureTool
решение4
Используя PowerShell, вы можете использоватьGet-Command tool.exe