Как узнать фактический путь к EXE- или BAT-файлу?

Как узнать фактический путь к EXE- или BAT-файлу?

Если у меня длинный и запутанный 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,вам не повезло. Для этого нет встроенной команды; и хотя можно использоватьвнешнийкоманды, которые будут копировать алгоритм поиска пути, эти команды не обязательно (или даже обычно) будут распознавать псевдонимы и встроенные команды. Например: Вот команда whichGnuWin32провалдля распознавания 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

Связанный контент