如何在bat文件(Windows)中添加可选的命令行参数

10

我有一个批处理文件,其中硬编码了以下参数:

SET upgrade=false

我想给用户一个选项来明确定义上传参数。默认情况下应该是false,如果用户明确定义upgrade=true,我应该将其视为true。

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

我对批处理文件处理不熟悉。我已经尝试使用默认值处理。

if "%2"=="" goto false

:false
SET upgrade=false
4个回答

9

简单易懂,试试这个方法。要将升级设置为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)

然后,您可以添加其他代码。


我觉得这个解决方案非常优雅。谢谢!我特别喜欢使用 if /i <A> EQU <B> 来检查不区分大小写的相等性! - Jean-Francois T.

9

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

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

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

因此,主批处理文件(例如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来完成相同的操作(例如:doWorkWithUpload.cmd)

@echo off
    set upgrade=true
    call doWork.cmd

谢谢。我已经尝试将参数设置为upload=true,但它仍然是false。 - Abhishek Goel
如果未定义上传,则设置upload=false。 如果不是“%upload%”==“true”,则设置upload=false。然后,当我执行echo %upgrade%时,每次都会得到false的值。 - Abhishek Goel
1
抱歉,当我阅读您的文本时,变量名为“upload”,而不是“upgrade”。将“upload”更改为“upgrade”应该可以解决这个问题。 - MC ND
我的早期疑问已经解决了。我的新疑问是,我想在参数中定义为upgrade=true,而不仅仅是定义为true。我该怎么做? - Abhishek Goel
情况1:> somecommand.bat true ------------ 情况2:> somecommand.bat upgrade=true --------------------- 我想实现第二种情况,但使用您的代码我只能实现第一种情况。 - Abhishek Goel
1
回答已更新。我通常需要使进程依赖于机器变量,除非从环境中更改默认值。这对我来说很有效,但看到你的尝试,不确定这是否适用于你想要的内容。 - MC ND

2
每当我需要在批处理脚本中使用布尔值时,我使用变量的缺失表示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文件可选参数解析,以方便而强大的方式定义许多可选参数。它提供了一种机制来指定每个选项的默认值。如果只有一个选项可能有点过度,但如果有很多选项,则非常有帮助。

有关具有许多选项的脚本示例,请参见getTimestamp.bat进行时间和日期处理


1

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

script.bat parameterA "upload=true"

等号符号=是“默认分隔符”之一,就像空格制表符,;一样。

你是什么意思?这个答案看起来很有趣,但我不明白如何使用它。 - Jean-Francois T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接