9

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

4

4 回答 4

29

不要执行命令检查它的可用性(即,在PATH环境变量中找到)。改用where

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

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

  • 程序的作用不是很明显
  • 意外的副作用(更改文件系统、发送电子邮件等)
  • 资源密集型、启动缓慢、阻塞 I/O、...

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

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

然后使用它,例如:

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
)

电源

在 上PowerShellGet-Command可以认为 cmdlet 相当于 cmd 的where.exe.

Get-Command <cmd>
IF ($? -ne $true)
{
    Write-Host "<cmd> not found in path"
    # Do something about it
}
于 2014-11-19T10:09:17.037 回答
1

是的:

@echo off
set found=
set program=7z.exe
for %%i in (%path%) do if exist %%i\%program% set found=%%i
echo "%found%"
于 2012-05-21T14:08:05.023 回答
-1

是的,打开一个命令窗口并输入“7z”(我假设这是可执行文件的名称)。如果您收到一条错误消息,指出无法识别命令或操作,那么您就知道路径语句在某处存在问题,否则不会。

于 2012-05-21T14:05:12.043 回答
-1

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

7z.exe
if %errorlevel%==9009 echo Command Not Found

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

于 2012-05-21T14:07:30.860 回答