确定命令是否在批处理文件中被识别


43

我正在编写一个蝙蝠脚本,在其中我会调用一个程序(例如javac)。为简单起见,我想在运行命令之前检查该命令是否存在。即命令是否存在于PATH中。

例如,

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
)

在Windows中执行此操作的最佳方法是什么?


您将如何“识别”您的命令?
Rook

在MS-DOS(真正的DOS)中,这非常简单。您刚刚检查了c:\ dos中是否存在exe文件;但即便如此,问题仍然存在。
Rook

对困惑感到抱歉。我的意思是Windows中的命令提示符。如果输入“ lkajsflksajdfj”,我想检测到它不是命令。如果键入“ notepad.exe”,则可以。
user46097 2010年

Answers:


54
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 

10
如果有人不希望cmd窗口内的输出,只需在>nul 2>nul后面添加mycommand
塞巴斯蒂安

请注意,输出通道比1和2多,因为1代表输出缓冲区,而2代表错误缓冲区,这取决于应用程序的开发方式,它应适用于Windows附带的常见应用程序,但是特定的CLI程序可以通道1和2重定向后仍会引发文本。
ElektroStudios 2015年

15

下面的代码应始终干净执行,没有垃圾输出。

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

输出:

found javac

与单线代码相同:

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

输出:

fail

需要注意的是秩序&&||似乎无关紧要。此外,要测试其存在性的命令需要返回错误级别<= 0才能起作用。希望命令有/?或--help参数,或与Java一样的版本信息命令。


这个解决方案是完美的!
robe007

7

最简单的方法是简单地运行命令,但是当然还有其他问题,因为您可能不想启动随机过程。

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

是一种替代方法,它在%PATH%环境变量列出的路径中搜索程序。本质上是的纯批处理版本which(1)。可以做得更好,但本质上就是这样。


1
这是完美的,完全可以满足您的要求!
Pez Cuckow

3

对于我的情况。绝对最简单的方法是使用||。或&&运算符。

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

要么

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

您为什么不也重定向标准输出?
乔伊

3

以下版本的一些改进。测试该命令是否存在并抑制不需要的输出。

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

其中<my_exe> NUL 2>&1 || echo my.exe不存在&& goto:EOF在脚本中效果很好
罗伯特·罗伯特(Robert Robert)

注意:如果要测试的文件名包含路径信息,则此方法不起作用。例如,WHERE \Windows\System32\cmd.exe=>INFO: Could not find files for the given pattern(s).
乔纳森·吉尔伯特

1

如果可以要求安装额外的工具,可以where在资源工具包中找到一个命令。看到Windows相当于whereis吗?

否则,对于不太旧的Windows版本,它可以纯做cmd,如DOS可执行文件查找中所述,但PATH除外


感谢您的回复!不幸的是,其中一项要求是它必须在香草盒(包括XP机器)上运行-因此无法选择wherees。
user46097 2010年

2
Gilles给出的第二个链接有一个漂亮的解决方案,它使用FOR且没有额外的工具。
paradroid

1

我知道这并不是您要找的东西,但是在逻辑上稍作更改,它就可以满足您的需求。

每个运行的命令都有一个返回码(即错误级别),如果返回码为0(零),则该命令已成功运行,如果返回码大于0,则说明出现了问题。

有关更多详细信息,请参见此处

就像是 -

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

这很聪明,我喜欢。

是的,但是很丑陋,如果没有找到该命令,则会抛出2行错误。因此,可能会找到更清洁的解决方案。
djangofan 2012年

0

尽管所有这些方式都可以工作,但为什么不采用内置方式呢?

If exists my_command do echo "my_command exists"

运行“如果/?” 在命令行上了解详细信息


5
这只会查看当前目录中是否存在具有该名称的文件/目录。它没有太多提示是否存在具有该名称的可运行命令,因为要确定您必须搜索PATH
乔伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.