Подтвердить что ты не робот

Как найти полный путь к приложению в пакете script

Как мне в пакете script найти полный путь к приложению XYZ, если он установлен

Разъяснения:

  • Приложение не находится в PATH
  • Все, что у меня есть, это имя в этом случае "ISTool.exe", и я хотел бы получить C:\Program\ISTool\ISTool.exe
4b9b3361

Ответ 1

Ответы, которые я получил от других, работали (но медленные или использовались дополнительные файлы) и работали для любого exe, но не очень соответствовали моим потребностям.

Так как я хотел найти конкретный exe, я пошел искать в реестре, используя REG QUERY. Я нашел ключ, содержащий данные, которые я хотел найти и извлек.

Результат получается быстрым, имеет несколько строк кода, но не очень красиво или многократно используется.

Краткий пример:

@ECHO off
SETLOCAL
set found=
FOR /F "tokens=1-3 delims= " %%a IN ('REG QUERY "HKEY_CLASSES_ROOT\Applications\ISTool.exe\shell\OpenWithISTool\command"') DO (
 set found=%%c
)

for /f "tokens=1-2" %%a in ("%found%") do (
 set my_exe=%%a
)
echo %my_exe%
ENDLOCAL

В результате получается "C:\Program\ISTool\ISTool.exe" (с кавычками)
Примечание: delims = выше следует вкладка char

Ответ 2

Вы можете найти исполняемый файл на пути (или, если необходимо, другую строку пути):

c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe

Подробности можно найти в конце текста справки для команды "for", "for /?", но сводка:

%~i    - expands %i removing any surrounding quotes.
%~fi   - expands %i to a fully qualified path name.
%~di   - expands %i to a drive letter only.
%~pi   - expands %i to a path only.
%~ni   - expands %i to a file name only.
%~xi   - expands %i to a file extension only.
%~si   - expanded path contains short names only.
%~ai   - expands %i to file attributes of file.
%~ti   - expands %i to date/time of file.
%~zi   - expands %i to size of file.
%~$P:i - searches the directories listed in the P environment variable
         and expands %i to the fully qualified name of the first one found.
         If the environment variable name is not defined or the file is not
         found by the search, then this modifier expands to the empty string.

Модификаторы могут быть объединены для получения сложных результатов:

%~dpi    - expands %i to a drive letter and path only.
%~nxi    - expands %i to a file name and extension only.
%~fsi    - expands %i to a full path name with short names only.
%~dp$P:i - searches the directories listed in the P environment variable
           for %i and expands to the drive letter and path of the first
           one found.
%~ftzai  - expands %i to a DIR like output line.

Если ваш исполняемый файл не находится на пути (согласно вашему редактированию), лучше всего использовать формат bare/subdirectory dir, который сделает это за вас. Из корневого каталога:

dir /b /s ISTool.exe

вы получите все файлы на этом диске с этим именем. Вам просто нужно проанализировать вывод. Мое предпочтение было бы использовать Cygwin "find /cygdrive -name ISTool.exe", но это потому, что я уже установил его. Вы можете не хотеть этого (или даже иметь этот вариант).

Update:

Эта команда dir /b /s займет некоторое время, так как она в основном ищет весь диск. Если это проблема, вы можете периодически рассмотреть создание кэшированной записи всех файлов на всех дисках с помощью cmd файла, например:

@echo off
setlocal enableextensions enabledelayedexpansion
del c:\files.cache.tmp >nul: 2>nul:
for %%d in (c d e) do (
    cd /d %%d:\
    dir /b /s >>c:\files.cache.tmp
)
del c:\files.cache >nul: 2>nul:
move c:\files.cache.tmp c:\files.cache
endlocal

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

Тогда вы можете просто использовать:

findstr \\ISTool.exe c:\files.cache

чтобы найти все ваши файлы.

Ответ 3

Основываясь на действительно полезных ответах здесь, я взломал эти две партии, которые, как я думал, я разделяю здесь (я знаю, что этой теме сейчас 3 года, но ее нашли в качестве 1-го матча, когда googling...):

1) which.bat:

@echo off
REM emulate the Linux which command
if "%1" == "" (
  echo Usage: %~nx0 ^<command[.ext]^>
  exit /b
)
setlocal
for %%P in (%PATHEXT%) do (
  for %%I in (%1 %1%%P) do (
    if exist "%%~$PATH:I" (
      echo %%~$PATH:I
      exit /b
    )
  )
)

не идеально, потому что есть все два теста, но он достаточно быстрый, поэтому я больше не беспокоился; уверен, что его можно сделать 1-й отдельный тест только с% 1.

2) findfile.bat:

@echo off
REM emulate the Linux find command
if "%1" == "" (
  echo Usage: %~nx0 ^<startdir^> ^<file^>
  exit /b
)
setlocal
for /f "delims=" %%A in ('dir /b /s %1\%2') do set F=%%A
if exist "%F%" echo %F%

Ответ 4

Это самое близкое мне. Один из недостатков заключается в том, что он работает только для одного диска на выполнение, но это может сделать более гибким. Другим является вывод, который всегда содержит // между контуром и именем файла. Но для определения есть допустимый путь.

@ECHO OFF

SET filename=autoexec.bat

FOR /R C:\ %%a IN (\) DO (
   IF EXIST "%%a\%filename%" (

      SET fullpath=%%a%filename%
      GOTO break
   )
)
:break

ECHO %fullpath%

Будет поставляться: C:\\autoexec.bat

EDIT:

Для пояснения цикл for повторяется через все каталоги, начинающиеся с заданного пути (C: \), и проверьте, существует ли имя файла в этом каталоге. Если это так, обе переменные объединяются и сохраняются в% fullpath%, и цикл заканчивается скачком.

Ответ 5

Иногда это простое решение работает, когда вы проверяете, соответствует ли результат тому, что вы ожидаете. Первая строка запускает команду и захватывает последнюю строку стандартного вывода.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.

Ответ 6

В качестве альтернативы, такие программы, как Everything и UltraSearch (freeware), SwiftSearch может искать MFT (вашего раздела NTFS) для файлов (поэтому он может сделать это очень быстро) (но Википедия утверждает, что подобное может нарушить вашу модель безопасности, найдя вещи, которые она не должна) - некоторые из них выглядят так, будто у них есть некоторые параметры командной строки, я их не использовал, но, возможно, это может быть полезно, если вы прибегаете к поиску полного диска.