How to test if an executable exists in the %PATH% from a windows batch file?

后端 未结 9 572
暖寄归人
暖寄归人 2020-12-22 20:33

I\'m looking for a simple way to test if an executable exists in the PATH environment variable from a Windows batch file.

Usage of external tools not provided by th

相关标签:
9条回答
  • 2020-12-22 20:59

    Here is a simple solution that attempts to run the application and handles any error afterwards.

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

    Error code 9009 usually means file not found.

    The only downside is that file.exe is actually executed if found (which in some cases is not desiderable).

    0 讨论(0)
  • 2020-12-22 20:59

    This can be accomplished via parameter substitution.

    %~$PATH:1
    

    This returns the full path of the executable filename in %1, else an empty string.

    This does not work with user-defined variables. So if the executable filename is not a parameter to your script, then you need a subroutine. For example:

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

    See http://ss64.com/nt/syntax-args.html

    0 讨论(0)
  • 2020-12-22 21:01

    If you are searching something like me on startup folder, should go folder. For example i search exe on startup folder and i use this code like

    @echo off
    cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
    where /q program.exe
    IF ERRORLEVEL 1 (
    echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe" 
    "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
    ) ELSE (
    ECHO Application exists. Let's go!
    )
    
    0 讨论(0)
  • 2020-12-22 21:02
    @echo off
    set found=
    set prog=cmd.exe
    for %%i in (%path%) do if exist %%i\%prog% set found=%%i
    echo "%found%"
    if "%found%"=="" ....
    
    0 讨论(0)
  • 2020-12-22 21:08
    for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
    if defined FOUND ...
    

    If you need this for different extensions, just iterate over PATHEXT:

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

    Could be that where also exists already on legacy Windows versions, but I don't have access to one, so I cannot tell. On my machine the following also works:

    where myExecutable
    

    and returns with a non-zero exit code if it couldn't be found. In a batch you probably also want to redirect output to NUL, though.

    Keep in mind

    Parsing in batch (.bat) files and on the command line differs (because batch files have %0%9), so you have to double the % there. On the command line this isn't necessary, so for variables are just %X.

    0 讨论(0)
  • 2020-12-22 21:13

    Windows Vista and later versions ship with a program called where.exe that searches for programs in the path. It works like this:

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

    For use in a batch file you can use the /q switch, which just sets ERRORLEVEL and doesn't produce any output.

    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!
    )
    

    Or a simple (but less readable) shorthand version that prints the message and exits your app:

    where /q myapplication || ECHO Cound not find app. && EXIT /B
    
    0 讨论(0)
提交回复
热议问题