如何从Windowsbatch file中testing%PATH%中是否存在可执行文件?

我正在寻找一种简单的方法来testing一个可执行文件是否存在于Windowsbatch file的PATH环境variables中。

不允许使用操作系统不提供的外部工具。 所需的最小Windows版本是Windows XP。

for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X) if defined FOUND ... 

如果你需要这个用于不同的扩展,只需遍历PATHEXT

 set FOUND= for %%e in (%PATHEXT%) do ( for %%X in (myExecutable%%e) do ( if not defined FOUND ( set FOUND=%%~$PATH:X ) ) ) 

可能是传统Windows版本中已经存在的where ,但是我没有访问权限,所以我不能说。 在我的机器上,以下内容也适用:

 where myExecutable 

如果找不到,则返回一个非零的退出码。 但是,在一个批处理中你可能也想把输出redirect到NUL

Windows Vista和更高版本随附称为where.exe的程序,用于searchpath中的程序。 它是这样工作的:

 D:\>where notepad C:\Windows\System32\notepad.exe C:\Windows\notepad.exe D:\>where where C:\Windows\System32\where.exe 

要在batch file中使用,可以使用/q开关, ERRORLEVEL设置ERRORLEVEL ,不会产生任何输出。

 where /q myapplication IF ERRORLEVEL 1 ( ECHO The application is missing. Ensure it is installed and placed in your PATH. EXIT /B ) ELSE ( ECHO Application exists. Let's go! ) 

或者打印邮件并退出应用程序的简单(但不太可读)的速记版本:

 where /q myapplication || ECHO Cound not find app. && EXIT /B 

这是一个简单的解决scheme,它试图运行应用程序,然后处理任何错误。

 file.exe /? 2> NUL IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path 

错误代码9009通常意味着找不到文件。

唯一的缺点是file.exe实际上是被执行的(在某些情况下是不可理想的)。

这可以通过参数replace完成。

 %~$PATH:1 

这将返回%1中可执行文件名的完整path,否则返回一个空string。

这不适用于用户定义的variables。 所以如果可执行文件名不是脚本的参数,那么你需要一个子程序。 例如:

 call :s_which app.exe if not "%_path% == "" ( app.exe ) goto :eof :s_which setlocal endlocal & set _path=%~$PATH:1 goto :eof 

请参阅http://ss64.com/nt/syntax-args.html

 @echo off set found= set prog=cmd.exe for %%i in (%path%) do if exist %%i\%prog% set found=%%i echo "%found%" if "%found%"=="" .... 

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

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

使用命令:powershelltestingpath“您正在寻找的exe”

如果存在则返回True,否则返回False。