2009-09-17 2 views
16

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

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

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

Не могли бы вы прояснить свою задачу? Вы хотите, скажем, получить «C: \ Program Files \ iTunes», если «iTunes» является входом? – Helen

+0

Итак, в качестве ввода вы хотите дать «ISTool.exe», и это не путь? Вам придется искать весь диск для этого. - 'dir c: \ ISTool.exe/s/b' - вы можете вывести вывод туда, где бы вы ни находились, но если файл появляется более одного раза, у вас будет несколько строк для обработки - также, если пользователь имеет более одного диска, вам может понадобиться сканировать все (не уверен, что лучший способ получить все диски, возможно, WMI-запрос для несъемных дисков ...) - но это может занять много времени, даже с SSD - вам лучше сканировать 5 или 6 известных мест, в том числе% ProgramFiles% \ ISTool \ и% ProgramFiles (x86)% \ ISTool и т. д. – BrainSlugs83

ответ

0

Ответы, которые я получил от других, работали (но замедлили или использовали дополнительные файлы) и работали для любого 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 = выше следует вкладки-полукокс

28

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

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's "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 

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

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

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

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

+0

Ahh, но это не на пути. Я отредактирую вопрос, чтобы это было ясно. – Nifle

+0

описание товара dir/b/s ISTool.exe Works * вид *. Но это занимает слишком много времени. Это заняло 43 секунды на моем текущем компьютере. – Nifle

+0

Вы думали о модернизации? :-) Нет, серьезно, он должен искать весь диск, поэтому потребуется некоторое время. Это то, что вы собираетесь делать много? Если это так, вы можете рассмотреть идею кэширования этой информации, см. Мое обновление. – paxdiablo

1

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

@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:

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

8

Основываясь на действительно полезные ответы здесь я взломали эти две партии, которые, как я думал, я разделяю здесь (я знаю, что этой теме сейчас 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% 
0

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

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

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

Смежные вопросы