检查命令是否在批处理文件中可用

ryn*_*ynd 7 windows command batch-file

我正在为Windows编写批处理文件并使用命令7z(7-Zip).我把它的位置放在PATH中.有没有相对简单的方法来检查命令是否可用?

Sac*_*eph 22

不要执行命令检查其可用性(即在找到PATH环境变量).where改为使用:

where 7z.exe >nul 2>nul
IF NOT ERRORLEVEL 0 (
    @echo 7z.exe not found in path.
    [do something about it]
)
Run Code Online (Sandbox Code Playgroud)

>nul2>nul防止显示的结果where命令给用户.直接执行程序有以下问题:

  • 并不是很明显该程序的功能
  • 意外的副作用(更改文件系统,发送电子邮件等)
  • 资源密集或启动缓慢

您还可以定义一个例程,它可以帮助用户确保他们的系统满足要求:

rem Ensures that the system has a specific program installed on the PATH.
:check_requirement
set "MISSING_REQUIREMENT=true"
where %1 > NUL 2>&1 && set "MISSING_REQUIREMENT=false"

IF "%MISSING_REQUIREMENT%"=="true" (
  echo Download and install %2 from %3
  set "MISSING_REQUIREMENTS=true"
)

exit /b
Run Code Online (Sandbox Code Playgroud)

然后使用它,如:

set "MISSING_REQUIREMENTS=false"

CALL :check_requirement curl cURL https://curl.haxx.se/download.html
CALL :check_requirement svn SlikSVN https://sliksvn.com/download/
CALL :check_requirement jq-win64 jq https://stedolan.github.io/jq/download/

IF "%MISSING_REQUIREMENTS%"=="true" (
  exit /b
)
Run Code Online (Sandbox Code Playgroud)


Mar*_*arc 0

如果未找到该命令,尝试执行7z.exe将返回9009。%errorlevel%你可以检查一下。

7z.exe
if %errorlevel%==9009 echo Command Not Found
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案对于这个特定7zip用例是可行的,并且可能适用于许多其他用例。但作为一般规则,执行命令来确定它是否存在可能是有害的。因此,请确保您了解执行正在检查的命令的效果,并谨慎使用此方法。