2009-09-17 18 views
16

¿Cómo en un archivo por lotes encuentro la ruta completa de la aplicación XYZ si se instala¿Cómo encuentro ruta completa a una aplicación en un archivo por lotes

Aclaraciones:

  1. La aplicación se no en el PATH
  2. Todo lo que tengo es su nombre en este caso "ISTool.exe" y me gustaría conseguir C: \ Program \ ISTool \ ISTool.exe
+0

¿Podría aclarar su tarea? ¿Desea, por ejemplo, obtener "C: \ Archivos de programa \ iTunes" con "iTunes" como entrada? – Helen

+0

Entonces, como entrada, ¿quiere dar "ISTool.exe" y no está en la ruta? Tendría que buscar todo el disco para ello. - 'dir c: \ ISTool.exe/s/b' - puede canalizar la salida a cualquier lugar, pero si el archivo aparece más de una vez, tendrá múltiples líneas para tratar, también, si el usuario tiene más de una unidad, es posible que necesite escanear todas ellas (no estoy seguro de cuál es la mejor manera de obtener todas las unidades, tal vez una consulta WMI para unidades no extraíbles ...), pero esto podría llevar años, incluso con SSD: es mejor que escanee 5 o 6 ubicaciones conocidas, incluido% ProgramFiles% \ ISTool \ y% ProgramFiles (x86)% \ ISTool, etc. – BrainSlugs83

Respuesta

0

Las respuestas que obtuve de otros funcionaron (pero ralentizaron o usaron archivos extra) y funcionaron para cualquier exe pero realmente no satisfacían mis necesidades.

Como quería encontrar un exe en particular, en su lugar busqué en el registro usando REG QUERY. Encontré una clave que contenía los datos que quería encontrar y la extraje.

El resultado es rápido, tiene pocas líneas de código pero no es muy bonito ni reutilizable.

ejemplo corto:

@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 

Esto se traduce en "C:\Program\ISTool\ISTool.exe" (con comillas)
Nota: delims = anterior es seguido por una pestaña-char

28

Puede localizar un archivo ejecutable en el camino (u otra cadena de ruta similar si es necesario):

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 

detalles se pueden encontrar al final del texto de ayuda para el comando "for", "for /?" pero el resumen es:

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

los modificadores se pueden combinar para obtener resultados compuestos:

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

Si el ejecutable no está en el camino (como p er su edición), su mejor opción es usar el formato de subdirectorio/bare/0 de dir que lo hará por usted. Desde el directorio raíz:

dir /b /s ISTool.exe 

obtendrá todos los archivos en esa unidad con ese nombre. Entonces solo tiene que analizar la salida. Mi propia preferencia sería usar Cygwin's "find /cygdrive -name ISTool.exe", pero eso es porque ya lo tengo instalado. Es posible que no desee eso (o incluso tenga esa opción).

Actualización:

Eso dir /b /s comando tardará un tiempo ya que está básicamente buscar todo el disco. Si eso es un problema que puede que desee considerar periódicamente la creación de un registro en caché de todos los archivos en todos los discos con un archivo cmd como:

@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 

Se puede hacer esto con las tareas programadas o bien todas las noches (para siempre-en el servidor) o en el arranque (para un escritorio). Incluso podría hacer que el guión sea más inteligente para hacerlo solo cada dos o tres días (tengo un guión de copia de seguridad automatizado que hace algo similar en las máquinas familiares que apoyo). Esto crea la lista en un archivo de caché temporal y luego sobrescribe el original para garantizar que se minimice la hora en que el archivo no existe.

a continuación, puedes utilizar:

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

para localizar todos los archivos.

+0

Ahh, pero no es en el camino. Editaré la pregunta para dejar eso en claro. – Nifle

+0

dir/b/s ISTool.exe funciona * tipo de *. Pero lleva un tiempo prohibitivo. Tardó 43 segundos en mi computadora actual. – Nifle

+0

¿Has pensado en actualizar? :-) No, en serio, tiene que buscar todo el disco, así que llevará un tiempo. ¿Es este el tipo de cosas que vas a estar haciendo mucho? Si es así, es posible que desee considerar la idea de almacenar en caché esa información, consulte mi actualización. – paxdiablo

1

Esto es lo más cercano que tengo. Una desventaja es que funciona solo para un disco por ejecución, pero eso podría ser más flexible. Otro es el resultado, que siempre contiene un // entre la ruta y el nombre del archivo. Pero por definición, esa es una ruta válida.

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

Will entregar: C:\\autoexec.bat

EDIT:

Para la explicación, el bucle for itera a través de todos los directorios a partir de la ruta dada (C: \) y comprobar si existe el nombre de archivo en ese directorio Si es así, ambas variables se concatenan y almacenan en% fullpath% y el ciclo finaliza con un salto.

8

Sobre la base de las respuestas muy útil en este caso I hackeado estos dos lotes que pensé compartir aquí (sé que este hilo ahora tiene 3 años, pero se encuentra como primer partido cuando se busca en Google ...):

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

no es perfecto porque hay Allways dos pruebas, pero es lo suficientemente rápido, así que no nos molestamos más acerca; Seguro que su posible primero hacer una prueba independiente con 1% solamente ...

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

A veces, esta solución sencilla obras, donde se comprueba para ver si la salida coincide con lo que esperar. La primera línea ejecuta el comando y toma la última línea de salida estándar.

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

Alternativamente, programas como Everything y UltraSearch (freeware), SwiftSearch puede buscar la MFT (de la partición NTFS) de archivos (por lo que puede hacerlo muy rápidamente), (pero Wikipedia afirma que esta especie una cosa puede violar su modelo de seguridad al encontrar cosas que no se supone) - algunos de ellos parecen tener algunos parámetros de línea de comandos, no los he usado, pero tal vez podría ser útil, si está recurriendo a un búsqueda de unidad completa.

Cuestiones relacionadas