如何在批处理脚本中find应用程序的完整path

如何在批处理脚本中查找应用程序XYZ的完整path(如果已安装)

澄清:

  1. 该应用程序不在PATH中
  2. 我所有的是这个名字在这种情况下“ISTool.exe”,我想获得C:\ Program \ ISTool \ ISTool.exe

Solutions Collecting From Web of "如何在批处理脚本中find应用程序的完整path"

您可以在路径上找到可执行文件(如果需要,也可以在其他路径类似的字符串中):

 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命令需要一段时间,因为它基本上是在搜索整个磁盘。 如果这是一个问题,您可能需要考虑定期创建一个所有文件的缓存记录在所有磁盘上的cmd文件,如:

 @echo off setlocal enableextensions enabledelayedexpansion del c:\files.cache.tmp >nul: 2>nul: for %%d in (cde) 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 

找到你所有的文件。

基于真正有用的答案,我砍了这两个我认为我在这里分享的批(我知道这个线程现在是3岁,但它发现第一场比赛时,谷歌搜索…):

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 …

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 /RC:\ %%a IN (\) DO ( IF EXIST "%%a\%filename%" ( SET fullpath=%%a%filename% GOTO break ) ) :break ECHO %fullpath% 

将提供: C:\\autoexec.bat

编辑:

为了说明,for循环遍历从给定路径(C:\)开始的所有目录,并检查文件名是否存在于该目录中。 如果是的话,这两个变量被连接并存储在%fullpath%中,并且循环以跳转结束。

有时候,这个简单的解决方案是有效的,在这里你检查输出是否与你期望的一致。 第一行运行命令并抓取标准输出的最后一行。

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

或者,像Everything和UltraSearch (免费软件)这样的程序, SwiftSearch可以搜索文件的MFT(所以它可以很快地完成)(但是维基百科声称这种事情可以通过查找事情不应该) – 其中一些看起来像他们有一些命令行参数,我没有使用它们,但也许这可能是有益的,如果你诉诸全驱动搜索。

我从别人得到的答案工作(但速度慢或使用额外的文件),并为任何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 = above后面跟着一个tab-char