【问题标题】:How to add optional command line parameter in bat file ( windows )如何在 bat 文件中添加可选的命令行参数(windows)
【发布时间】:2013-10-22 06:34:47
【问题描述】:

我有一个包含以下硬编码参数的批处理文件

SET upgrade=false

我想给用户一个选项来明确定义上传参数。默认情况下它应该是假的,如果用户明确定义upgrade=true 我应该把它当作真。

我还想检查上传参数中布尔值的验证。

我是批处理文件处理的新手。我已经尝试过默认值处理。

if "%2"=="" goto false

:false
SET upgrade=false

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    简单,试试这个。要将升级设置为 true,请使用 /U 作为参数:

    @echo off
    set upgrade=FALSE
    :parse
    if /i "%1" EQU "/u" set upgrade=TRUE
    if /i "%1" EQU "/?" Echo HELP MSG & goto :eof
    
    if "%1" NEQ "" (shift /1 & goto :parse)
    

    然后您可以添加其余代码。

    【讨论】:

      【解决方案2】:

      检查变量是否存在。如果不存在,则假定为假。任何与“真”不同的值都假定为假

      if not defined upgrade set upgrade=false
      if not "%upgrade%"=="true" set upgrade=false
      

      当升级变量需要为真时,在调用批处理文件之前定义它,或者从命令行或使用第二个批处理文件调用第一个批处理文件并设置值。

      所以,主批处理 (ej.doWork.cmd) 文件会看起来

      @echo off
          .... work work work ...
          if not defined upgrade set upgrade=false
          if not "%upgrade%"=="true" set upgrade=false
          .... work work work ...
      

      当您需要从另一个配置开始时(在此示例中进行升级),您需要从命令行配置变量

      set upgrade=true 
      doWork.cmd
      

      或者你可以创建第二个 cmd 来做同样的事情 (ej.doWorkWithUpload.cmd)

      @echo off
          set upgrade=true
          call doWork.cmd
      

      【讨论】:

      • 谢谢。我已经通过将参数设置为 upload=true 来尝试它,但它仍然是 false
      • 如果未定义上传 set upload=false 如果不是 "%upload%"=="true" set upload=false 那么我正在做 echo %upgrade% 我每次都将值设为 false 跨度>
      • 对不起。当我阅读您的文本时,变量的名称是“上传”,而不是升级。用“升级”改变“上传”应该可以解决它
      • 我之前的疑问得到了解决。我的新疑问不仅仅是在我想定义为 upgrade=true 的参数中定义 true。我该怎么做
      • 答案已更新。我通常必须使进程依赖于机器变量,除非从环境中更改默认值。对我有用,但看看你正在尝试什么,不确定这是否适合你想要的。
      【解决方案3】:

      每当我想要批处理脚本中的布尔值时,我都会使用不存在变量来表示 FALSE,并使用存在变量(任何值)来表示 TRUE。

      要将值设置为 TRUE,只需使用任意值定义变量即可。我喜欢使用1的值:

      set var=1
      

      要将值设置为 FALSE,请取消定义变量:

      "set var="
      

      每当我需要测试值时,我只需使用

      if defined var (rem true conditional statements) else (rem false conditional statements)
      

      现在,允许将升级设置为逻辑 TRUE 的可选参数 - 将值初始化为 false,然后检查参数列表以查看是否存在选项,如果存在,请将值设置为 TRUE。我推荐像/U 这样的选项来表示升级。你没有说你的脚本是否已经有参数。我假设你有 2 个必需的参数。

      您应该决定您的选项是在所需参数之前还是之后。最简单的是后。因此,如果您有 2 个必需参数,则该选项(如果存在)将位于 %3

      @echo off
      setlocal
      :: Initialize default value to FALSE
      set "upgrade="
      :: Look for option
      if /i %3 equ /U set upgrade=1
      

      您可以将选项放在前面,但是如果值以/ 开头,则必须引用所需的参数值。处理完一个选项后,使用SHIFT /1保证你需要的参数以%1开头

      @echo off
      setlocal
      :: Initialize default value to FALSE
      set "upgrade="
      :: Look for option
      if /i %1 equ /U (
        set upgrade=1
        shift /1
      )
      :: Required parameters now start with %1, regardless whether the option was present.
      

      您可以通过添加:parseOptions 标签来扩展上述方法以支持多个选项,然后添加多个 IF 语句,每个选项一个。每次发现一个选项时,只需 SHIFT 参数和GOTO :parseOptions 即可查找下一个选项。如果选项位于末尾,则使用SHIFT /3。如果选项在开头,则为SHIFT /1。但是如果有很多选项,编码就会变得乏味且容易出错。

      查看Windows Bat file optional argument parsing,了解一种方便而强大的方式来定义许多可选参数。它提供了一种机制来为每个选项指定默认值。单个选项可能有点矫枉过正,但如果您有很多选项,它会非常有用。

      有关具有多个选项的脚本示例,请参阅getTimestamp.bat for time and date processing

      【讨论】:

        【解决方案4】:

        只需将命令行参数放在双引号中即可:

        script.bat parameterA "upload=true"
        

        等号 = 是“默认分隔符”之一,例如 空格制表符;.

        【讨论】:

          猜你喜欢
          • 2011-06-24
          • 2011-04-27
          • 2020-10-06
          • 2014-10-11
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 2018-12-28
          相关资源
          最近更新 更多