Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm writing a bat script in which I invoke a program (such as javac). For simplicity, I want to check if the command exists before I run it. i.e. If the command exists in PATH.

For example,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe

What's the best way to do this in Windows?

share|improve this question
How will you "recognize" your command ? – Rook Aug 13 '10 at 12:56
In MS-DOS (true DOS) this was rather simple; you just checked the existence of an exe file in c:\dos; but even then the question remains. – Rook Aug 13 '10 at 12:57
Sorry for the confusion. I meant essentially a command prompt in Windows. If I type "lkajsflksajdfj" I want to detect it isn't a command. If I type "notepad.exe", it's OK. – user46097 Aug 13 '10 at 13:18
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
share|improve this answer
If someone doesn't want the output inside the cmd window just add >nul 2>nul behind the mycommand. – Sebastian Aug 13 '14 at 13:09
@ElektroStudios your wrong, it is valid syntax, look at the other answers using it. I have tested it. So no incorrect syntax. Look at e.g. for redirections! – Sebastian Oct 13 '15 at 14:23
Note that there are more output channels than 1 and 2, since 1 stands for output buffer and 2 for error buffer, it depends on how the application was developed, it should work for common apps that ships with Windows, but an specific CLI program could still throwing text when channels 1 and 2 are redirected. – ElektroStudios Oct 13 '15 at 14:26

The code below should always execute cleanly with no garbage output.

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail


found javac

The same code as a one-liner:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )



Note that the order of && and || seems to matter. Also, the command whose existence you are testing for needs to return with an errorlevel <= 0 for this to work. Hopefully the command has /? or --help arguments or, as with java, a version info command.

share|improve this answer

The easiest way is to simply run the command, but that has other problems, of course, since maybe you don't want to have a random process started.

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

is an alternative which searchs for the program in the paths listed by the %PATH% environment variable. It's essentially a pure batch version of which(1). It can be made better but essentially this is it.

share|improve this answer
This is perfect, does exactly what was asked for! – Pez Cuckow Feb 18 '13 at 12:26

Some refinements to version below. Test that command exists and suppress unneeded output.

WHERE scp >nul 2>nul
share|improve this answer
where <my_exe> NUL 2>&1 || echo my.exe does not exist && goto :EOF works nicely in scripts – Robert Nov 10 '15 at 15:01

If requiring the installation of extra tools is ok, there's a where command in the resource kits; see Windows equivalent of whereis?.

Otherwise, for versions of Windows that are not too ancient, it's doable in pure cmd, as mentioned in Dos executable lookup except PATH.

share|improve this answer
Thanks for the reponse! Unfortunately, one of the requirements is that it has to run on a vanilla box (XP machines included) - so whereis isn't an option. – user46097 Aug 13 '10 at 13:16
The second link Gilles gave has a nifty solution that uses FOR and no extra tools. – paradroid Aug 13 '10 at 13:19

I know this not quite what you're looking for, but with a slight change in logic it should accomplish what you need.

Every command that is run has a return code (aka errorlevel), if the return code is 0 (zero), the command has run successfully, if the return code is greater than 0, something has gone wrong.

See here for more details.

Something like -

if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
share|improve this answer
This is clever, I like it. – Shinrai Aug 13 '10 at 22:20
Yeah, but its ugly since, if the command is not found it throws a 2 line error. So, a cleaner solution could be found possibly. – djangofan Nov 28 '12 at 18:43

For my situation. The absolute simplest way is using the || or && operator.

my_command.exe -version 2>NUL && echo "my_command exists"


my_command.exe -version 2>NUL || echo "my_command doesn't exist"
share|improve this answer
@user46097: dev/null doesn't exist on Windows; it's NUL. – Hello71 Aug 13 '10 at 14:08
Yes :). Edited. – user46097 Aug 13 '10 at 14:16
Why don't you redirect stdout too? – Joey Aug 14 '10 at 13:09

While all those way might work, why not the built in way?

If exists my_command do echo "my_command exists"

Run "if /?" on the command line for details

share|improve this answer
This will only look whether a file/directory with that name exists in the current directory. It provides not much of a hint whether a runnable command with that name exists because to determine that you'd have to search the PATH. – Joey Feb 19 '13 at 7:18

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .