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 the OS is not allowed. The minimal Windows version required is Windows XP.
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 the OS is not allowed. The minimal Windows version required is Windows XP.
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
.
where myExecutable
. –
Stormie %0
–%9
), so you have to double the %
there. On the command line this isn't necessary, so for
variables are just %x
. –
Engender where
opportunity), and you would get upvotes - at least from me. :) –
Krona 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
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
.
where myExecutable
. –
Stormie %0
–%9
), so you have to double the %
there. On the command line this isn't necessary, so for
variables are just %x
. –
Engender where
opportunity), and you would get upvotes - at least from me. :) –
Krona 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).
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
setlocal
but for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
is one line solution with for
used as workaround for %%~$PATH:X
in order to avoid call
and %~$PATH:1
. –
Kinder For those looking for a PowerShell option. You can use the Get-Command
cmdlet passing two items. First give the current dir location with .\
prefixed, then give just the exe name.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
That will return true if found local or in system wide paths.
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
for
is not smart enough to parse the contents of PATH
. It will miss directories with spaces, for example. And even when you use for /f
with delims=;
it will not work correctly if a directory contains a ;
and is quoted. –
Engender ;
with "; "
: set quotedPath="%PATH:;="; "%"
. –
Excaudate "C:\Folder with; semicolon, quoted"
to the path and see what happens. At least here it tries treating every »word« separately which, in a way, is worse than the behaviour before. –
Engender Sometimes this simple solution works, where you check to see if the output matches what you expect. The first line runs the command and grabs the last line of standard output.
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
Use command : powershell Test-Path "exe which you looking for"
It will return True if its present, otherwise False.
Test-Path
only checks the specified path, i.e. Test-Path nuget.exe
will return true only if nuget.exe
is in the current directory. If nuget.exe is not in the current directory, it will return false, even if it is in a directory listed in the PATH variable. In PowerShell Get-Command
might work better(#11242868), but take into account that for PowerShell the current directory is not in the path. –
Assume (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
will return true if found local or in path. –
Destructor © 2022 - 2024 — McMap. All rights reserved.