2009-09-17 15 views
16

Jak mogę w skrypcie znaleźć pełną ścieżkę do aplikacji XYZ jeśli jest zainstalowanyJak znaleźć pełną ścieżkę do aplikacji w skrypcie

Wyjaśnienie:

  1. Aplikacja jest nie w PATH
  2. Wszystko co mam jest to nazwa w tym przypadku "ISTool.exe" i chciałbym dostać C: \ Program \ ISTool \ ISTool.exe
+0

Czy możesz wyjaśnić swoje zadanie? Czy chcesz na przykład wprowadzić "C: \ Program Files \ iTunes" jako "dane wejściowe"? – Helen

+0

Tak więc, jako dane wejściowe, które chcesz podać "ISTool.exe" i nie ma go na ścieżce? Musiałbyś przeszukać cały dysk. - 'dir c: \ ISTool.exe/s/b' - możesz wyprowadzać dane wyjściowe do dowolnego miejsca, ale jeśli plik pojawi się więcej niż jeden raz, będziesz miał do wyboru wiele linii - także, jeśli użytkownik ma więcej niż jeden dysk, który możesz przeskanować wszystkie (nie wiesz, jaki jest najlepszy sposób na uzyskanie wszystkich dysków, może kwerendy WMI dla dysków niewymiennych ...) - ale to może potrwać wieki, nawet z dyskiem SSD - lepiej skanować 5 lub 6 znanych lokalizacji, w tym% ProgramFiles% \ ISTool \ and% ProgramFiles (x86)% \ ISTool, itp. – BrainSlugs83

Odpowiedz

0

Odpowiedzi, które otrzymałem od innych osób, działały (ale wolno lub używały dodatkowych plików) i działały dla każdego exe, ale nie odpowiadały moim potrzebom.

Ponieważ chciałem znaleźć konkretnego exe poszedłem szukać w rejestrze za pomocą REG QUERY zamiast tego. Znalazłem klucz, który zawierał dane, które chciałem znaleźć i wyodrębnić.

Wynik jest szybki, ma kilka linijek kodu, ale nie jest zbyt ładny i nie nadaje się do ponownego użycia.

Krótki przykład:

@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 

Wynika to w "C:\Program\ISTool\ISTool.exe" (cytaty)
Uwaga: delims = powyżej następuje tab-char

28

można zlokalizować plik wykonywalny na ścieżce (lub inny ciąg ścieżki, jak w razie potrzeby):

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 

Szczegóły można znaleźć na końcu tekstu pomocy dla polecenia "for", "for /?" ale podsumowanie jest:

%~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. 

modyfikatory mogą być łączone w celu uzyskania złożonych wyników:

%~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. 

Jeśli plik wykonywalny nie znajduje się na ścieżce (jako P er Twoja edycja), najlepiej jest użyć formatu bare/subdirectory z dir, który zrobi to za ciebie. Z katalogu głównego:

dir /b /s ISTool.exe 

dostaniesz wszystkie pliki na tym dysku o tej nazwie. Następnie wystarczy przeanalizować wynik. Moja własna preferencja polega na użyciu Cygwin's "find /cygdrive -name ISTool.exe", ale to dlatego, że już go zainstalowałem. Możesz tego nie chcieć (lub nawet mieć taką opcję).

Aktualizacja:

To polecenie dir /b /s zajmie trochę czasu, ponieważ w zasadzie przeszukiwania całego dysku. Jeśli jest to problem może chcesz okresowo rozważyć utworzenie pamięci podręcznej zapis wszystkich plików na wszystkich dyskach z pliku cmd jak:

@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 

Można to zrobić z zaplanowanych zadań albo nocnej (za zawsze na serwerze) lub podczas rozruchu (na pulpicie). Możesz nawet uczynić skrypt bardziej inteligentnym, aby robił to tylko co kilka dni (mam zautomatyzowany skrypt tworzenia kopii zapasowych, który robi to samo na rodzinnych maszynach, które obsługuję). Spowoduje to utworzenie listy w tymczasowym pliku pamięci podręcznej, a następnie nadpisanie oryginalnej, aby zapewnić, że czas, w którym plik nie istnieje, zostanie zminimalizowany.

Następnie można po prostu użyć:

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

zlokalizować wszystkie pliki.

+0

Ahh, ale to nie jest na ścieżce. Będę edytować pytanie, aby to wyjaśnić. – Nifle

+0

dir/b/s ISTool.exe działa * w rodzaju *. Ale zajmuje to dużo czasu. Trwało to 43 sekundy na moim obecnym komputerze. – Nifle

+0

Czy myślisz o uaktualnieniu? :-) Nie, poważnie, musi przeszukać cały dysk, więc zajmie to trochę czasu. Czy to jest coś, co robisz dużo? Jeśli tak, możesz rozważyć pomysł buforowania tych informacji, zobacz moją aktualizację. – paxdiablo

1

To jest najbliższy, jaki mam. Wadą jest to, że działa tylko dla jednego dysku na wykonanie, ale może to być bardziej elastyczne. Innym wyjściem jest zawsze // między ścieżką a nazwą pliku. Ale z definicji jest to poprawna ścieżka.

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

Będzie dostarczać: C:\\autoexec.bat

EDIT:

Dla wyjaśnienia, do pętli iteracji wszystkich katalogów począwszy od danej ścieżki (C: \) i sprawdź, czy nazwa pliku istnieje w ten katalog. Jeśli tak, obie zmienne są konkatenowane i przechowywane w% fullpath%, a pętla jest zakończona skokiem.

8

W oparciu o bardzo pomocne odpowiedzi tu zhakowałem te dwie partie, o których myślałem, że się tu dzielę (wiem, że ten wątek ma teraz 3 lata, ale został znaleziony jako pierwszy mecz podczas googlowania ...):

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 
    ) 
) 
) 

nie jest doskonały, ponieważ istnieją dwa testy zawsze dobrze, ale jej wystarczająco szybko, więc nie zrobił dodatkowo przejmować; pewien jego możliwości do 1 zrobić oddzielny test z% 1 tylko ...

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

Czasami proste rozwiązanie działa, gdzie można sprawdzić, czy wyjście na mecz, czego oczekiwać. Pierwsza linia uruchamia polecenie i pobiera ostatnią linię standardowego wyjścia.

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

Alternatywnie, programy jak Everything i UltraSearch (freeware), SwiftSearch mogą przeszukiwać MFT (z partycji NTFS) dla plików (tak można to zrobić bardzo szybko), (ale Wikipedia twierdzi, tego rodzaju rzeczy może naruszyć twój model bezpieczeństwa, znajdując rzeczy, których nie powinien) - niektóre z nich wyglądają, jakby miały pewne parametry wiersza poleceń, nie używałem ich, ale może to mogłoby być pomocne, jeśli używasz wyszukiwanie pełnoekranowe.

Powiązane problemy