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

use*_*097 62 windows script batch command-line

我正在编写一个 bat 脚本,在其中调用一个程序(例如 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
)
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*elo 72

WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
Run Code Online (Sandbox Code Playgroud)

  • 如果有人不想要 cmd 窗口内的输出,只需在 `mycommand` 后面添加 `>nul 2>nul`。 (14认同)
  • 为了避免 where 命令的输出,可以使用 /q(安静)开关: where /q mycommand (6认同)

ngr*_*een 19

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

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)
Run Code Online (Sandbox Code Playgroud)

输出:

found javac
Run Code Online (Sandbox Code Playgroud)

与单行代码相同的代码:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )
Run Code Online (Sandbox Code Playgroud)

输出:

fail
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*oey 8

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

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

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


yul*_*kov 5

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

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 2

如果需要安装额外的工具也可以,where资源包中有一个命令;看到Windows相当于whereis吗?

否则,对于不太古老的 Windows 版本,它可以在 pure 中执行cmd,如Dos 可执行文件查找(除了 PATH )中所述。

  • Gilles 给出的第二个链接有一个漂亮的解决方案,它使用 FOR 并且不需要额外的工具。 (2认同)