代码之家  ›  专栏  ›  技术社区  ›  Nifle Hassan Syed

如何在批处理脚本中找到应用程序的完整路径

  •  16
  • Nifle Hassan Syed  · 技术社区  · 15 年前

    如果安装了应用程序XYZ,如何在批处理脚本中找到它的完整路径?

    澄清:

    1. 应用程序不在路径中
    2. 我所拥有的只是这个例子中的名字“istol.exe”,我想知道 C:\Program\ISTOL\ISTOL.exe(程序\ISTOL\ISTOL.exe)
    6 回复  |  直到 8 年前
        1
  •  28
  •   paxdiablo    15 年前

    您可以在路径上找到一个可执行文件(或其他路径,如有必要,可以使用字符串):

    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.
    

    如果您的可执行文件不在路径上(根据您的编辑),您最好使用的是 dir 这会帮你的。从根目录:

    dir /b /s ISTool.exe
    

    将获取该驱动器上具有该名称的所有文件。然后您只需要分析输出。我自己喜欢用Cygwin的 "find /cygdrive -name ISTool.exe" 但那是因为我已经安装了它。你可能不想那样做(甚至不想那样做)。

    更新:

    dir /b /s 命令需要一段时间,因为它基本上是在搜索整个磁盘。如果这是一个问题,您可能需要考虑定期使用如下命令文件在所有磁盘上创建所有文件的缓存记录:

    @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
    

    找到所有文件。

        2
  •  8
  •   BatchApe    12 年前

    基于这里真正有用的答案,我把这两个我认为我在这里分享的批次进行了分解(我知道这个线程现在已经3年了,但是在谷歌搜索时发现它是第一个匹配的…):

    1)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做一个单独的测试…

    2)文件.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%
    
        3
  •  1
  •   Frank Bollack    15 年前

    这是我最近得到的。一个缺点是,它只能在每次执行一个驱动器时工作,但这可能使其更加灵活。另一个是输出,它始终包含 // 在路径和文件名之间。但根据定义,这是一个有效的路径。

    @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

    编辑:

    为了便于解释,for循环将遍历从给定路径(C:\)开始的所有目录,并检查该目录中是否存在文件名。如果是这样,两个变量都被连接并存储在%fullpath%中,循环将被一个跳转终止。

        4
  •  0
  •   bdombro    11 年前

    有时,这个简单的解决方案会起作用,您可以在这里检查输出是否与预期相符。第一行运行命令并获取标准输出的最后一行。

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

    或者,像这样的程序 Everything ,和 UltraSearch (免费软件) SwiftSearch 可以在(NTFS分区的)MFT中搜索文件(因此它可以这样做) 非常 很快),(但维基百科声称,这类事情可能会破坏你的安全模式,找到一些不该找到的东西)--其中一些看起来像是有一些命令行参数,我没有使用过,但如果你使用全驱动器搜索,可能会有所帮助。

        6
  •  0
  •   marc_s HarisH Sharma    8 年前

    我从其他人那里得到的答案很有效(但速度很慢或使用了额外的文件),并且适用于任何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=上面跟一个制表符