如何从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
@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。