如何测试Windows批处理文件中%PATH%中是否存在可执行文件?

sor*_*rin 84 windows batch-file batch-processing

我正在寻找一种简单的方法来测试Windows批处理文件中的PATH环境变量中是否存在可执行文件.

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

Rya*_*ose 70

Windows Vista及更高版本附带一个程序where.exe,用于搜索路径中的程序.它的工作原理如下:

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

D:\>where where
C:\Windows\System32\where.exe
Run Code Online (Sandbox Code Playgroud)

要在批处理文件中使用,您可以使用/q仅设置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!
)
Run Code Online (Sandbox Code Playgroud)

或者是一个简单(但不太可读)的速记版本,可以打印消息并退出您的应用:

where /q myapplication || ECHO Cound not find app. && EXIT /B
Run Code Online (Sandbox Code Playgroud)


Joe*_*oey 68

for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...
Run Code Online (Sandbox Code Playgroud)

如果你需要这个用于不同的扩展,只需迭代PATHEXT:

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

也许这where已经存在于旧版Windows上,但我无法访问,因此我无法分辨.在我的机器上,以下也有效:

where myExecutable
Run Code Online (Sandbox Code Playgroud)

如果找不到,则返回非零退出代码.但是,在批处理中,您可能还希望将输出重定向到NUL.

记住

批处理(.bat)文件和命令行中的解析不同(因为批处理文件具有%0- %9),因此您必须将其加倍%.在命令行上这不是必需的,因此对于变量而言%X.

  • 对于XP,您需要循环脚本(或从RK下载where.exe).Vista和7与where.exe一起发货.我知道OP专门说XP,但对于后人来说,最好的答案总是使用`where myExecutable`. (4认同)
  • simengineer:批处理文件和命令行解析不同(因为批处理文件有'%0`-`%9`),所以你必须将'%`加倍.在命令行上这不是必需的,所以`for`变量只是'%x`. (3认同)
  • 我是一个批处理脚本初学者,我不确定%% x是什么意思.在我的Windows 7系统上,我尝试输入:for(%myXecutable.exe)中的%% X(设置FOUND = %%〜$ PATH:X),然后点击返回.我得到了这个响应:C:\ Users\James> for %% X in(cmd.exe)do(set FOUND = %%〜$ PATH:X)%% X此时是意外的. (2认同)

ead*_*ter 18

这是一个简单的解决方案,尝试运行应用程序并在之后处理任何错误.

file.exe /?  2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
Run Code Online (Sandbox Code Playgroud)

错误代码9009通常表示找不到文件.

唯一的缺点是,file.exe如果找到实际执行(在某些情况下是不可取的).

  • 唯一的缺点是执行"file.exe"(在某些情况下是不需要的) (22认同)

Chr*_*Noe 6

这可以通过参数替换来实现。

%~$PATH:1
Run Code Online (Sandbox Code Playgroud)

这将返回%1中可执行文件名的完整路径,否则返回一个空字符串。

这不适用于用户定义的变量。因此,如果可执行文件名不是脚本的参数,则需要一个子例程。例如:

call :s_which app.exe
if not "%_path%" == "" (
  "%_path%"
)

goto :eof

:s_which
  setlocal
  endlocal & set _path=%~$PATH:1
  goto :eof
Run Code Online (Sandbox Code Playgroud)

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