2

Если у меня есть длинный и вовлеченный 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 или это можно сделать с помощью командного файла?

6 ответов6

4

Все зависит от того, какой командный интерпретатор запущен, и не существует внешней утилиты, которая будет делать это правильно во всех случаях. Это по очень важной причине:

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

Если у вас есть GnuWin32, это так просто, как:

which ObscureTool.exe

Более того, если вы вызываете его только по имени (без расширения, как в "ObscureTool"), он все равно найдет нужную вещь. Это может быть проблемой, если у вас есть два "исполняемых" файла: «ObscureTool.exe» и «ObscureTool.bat». В этом случае, который будет найти тот , который происходит сначала в пути. В этом случае вы бы просто сказали:

which ObscureTool
3

Используя powershell вы можете использовать Get-Command tool.exe

3

Я использую обычную Windows 7 и просто набираю «где java.exe», кажется, отлично работает без какого-либо дополнительного программного обеспечения.

2

Вы можете использовать 'dir', инструмент для просмотра каталогов:

dir "c:\Obscure Tool.exe" /s/b

/ S означает поиск в подкаталогах, и, поскольку вы запускаете в корневой папке (C:), он будет искать все папки на этом диске.
Параметр / b позволяет отображать результат в "голом" формате без информации о заголовке или сводки (т. Е. Вы просто получите путь и имя файла).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .