【问题标题】:Check whether command is available in batch file检查命令是否在批处理文件中可用
【发布时间】:2012-05-28 00:59:27
【问题描述】:

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

【问题讨论】:

    标签: windows batch-file command


    【解决方案1】:

    执行命令以检查其可用性(即,在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
    )
    

    PowerShell

    PowerShell 上,Get-Command cmdlet 可以被认为等同于 cmd 的where.exe

    Get-Command <cmd>
    IF ($? -ne $true)
    {
        Write-Host "<cmd> not found in path"
        # Do something about it
    }
    

    【讨论】:

      【解决方案2】:

      是的:

      @echo off
      set found=
      set program=7z.exe
      for %%i in (%path%) do if exist %%i\%program% set found=%%i
      echo "%found%"
      

      【讨论】:

      • 谢谢,为什么说set found=
      • @Joey 有一个简单的解决方法。使用双引号。但是,如果没有指定命令的扩展名(exe、bat),而接受的解决方案将指定,这将不起作用。
      【解决方案3】:

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

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

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

      【讨论】:

      • 我猜一个更好的方法是7z.exe &gt;nul 2&gt;&amp;1 | echo Command not found
      • 在这种情况下,这是可行的,但这是一种冒险的习惯——如果尝试delete-hard-drive.bat 来测试它的存在会怎样?
      • @ErichGubler,我从未建议原始发帖人将其用作全面的解决方案。我回答了一个对他的特定用例有效且无害的选项。出于这个原因,我认为它不值得投反对票。
      • @Marc,免责声明足以让我删除我的反对票! :)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 2013-01-08
        相关资源
        最近更新 更多