Как мне в пакете script найти полный путь к приложению XYZ, если он установлен
Разъяснения:
- Приложение не находится в PATH
- Все, что у меня есть, это имя в этом случае "ISTool.exe", и я хотел бы получить C:\Program\ISTool\ISTool.exe
Как мне в пакете script найти полный путь к приложению XYZ, если он установлен
Разъяснения:
Ответы, которые я получил от других, работали (но медленные или использовались дополнительные файлы) и работали для любого 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
Вы можете найти исполняемый файл на пути (или, если необходимо, другую строку пути):
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 года, но ее нашли в качестве 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%
Это самое близкое мне. Один из недостатков заключается в том, что он работает только для одного диска на выполнение, но это может сделать более гибким. Другим является вывод, который всегда содержит //
между контуром и именем файла. Но для определения есть допустимый путь.
@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%, и цикл заканчивается скачком.
Иногда это простое решение работает, когда вы проверяете, соответствует ли результат тому, что вы ожидаете. Первая строка запускает команду и захватывает последнюю строку стандартного вывода.
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
В качестве альтернативы, такие программы, как Everything и UltraSearch (freeware), SwiftSearch может искать MFT (вашего раздела NTFS) для файлов (поэтому он может сделать это очень быстро) (но Википедия утверждает, что подобное может нарушить вашу модель безопасности, найдя вещи, которые она не должна) - некоторые из них выглядят так, будто у них есть некоторые параметры командной строки, я их не использовал, но, возможно, это может быть полезно, если вы прибегаете к поиску полного диска.