批处理文件:声明和使用布尔变量的最佳方法是什么?

43

在批处理文件中声明和使用布尔变量的最佳方法是什么?这是我现在正在做的:

set "condition=true"

:: Some code that may change the condition

if %condition% == true (
    :: Some work
)

有没有更好、更“正式”的方法来做这件事?(例如,在Bash中,您只需执行if $condition,因为truefalse是它们自己的命令。)


6
就是这样了。批处理中的变量只能是字符串或32位整数,没有其他类型。 - SomethingDark
4
你可以使用 if defined var,这样可以在 iffor 和其他括号代码块中工作,而不需要延迟扩展。此外,还可以根据错误级别为零或非零进行条件执行。 - rojo
难道不应该是 "%condition%"=="true" 吗? - SomeDude
@svasa - 如果可以保证%condition%有值,那么你就不需要引号;引号只是为了避免语法错误,如果它是空的。 - SomethingDark
@SomethingDark:所有变量都是字符串;在批处理文件中没有数值变量。由set /A命令执行的算术运算仅管理32位整数,但那并不完全相同... - Aacini
4个回答

42
set "condition="

并且

set "condition=y"

其中y可以是任何字符串或数字。

这允许使用if definedif not defined,两者都可在块语句(一系列括号括起来的语句)中使用,以查询标志的运行时状态,而无需使用enabledelayedexpansion


例如:

set "condition="
if defined condition (echo true) else (echo false)

set "condition=y"
if defined condition (echo true) else (echo false)

第一个将会回显false,第二个回显true


6
@AlexanderSchäl:更多解释。%condition%指的是变量condition内容,因此如果condition的值为y,则if defined %condition%将被解释为if defined y - Magoo

23
我暂时还坚持我的原始答案:
set "condition=true"

:: Some code...

if "%condition%" == "true" (
    %= Do something... =%
)

如果有更好的方法,请回答这个问题,我会很乐意接受你的答案。


5
Magoo的答案更好,因为它在代码块内也适用。 - jeb
我想象中,Magoo的执行速度更快,因为它不需要比较字符串,并且它是最接近另一种编程语言布尔值操作的方法。例如:C语言(非0即真),批处理(有值即真)。 - Daniel Briceño

6

我想另一个选择是使用“1==1”作为真值。

因此,重复示例:

set condition=1==1

:: some code

if %condition% (
    %= Do something... =%
)

当然,可以设置一些变量来保存truefalse的值:
set true=1==1
set false=1==0

set condition=%true%

:: some code

if %condition% (
    %= Do something... =%
)

0

这对我有效。我怀疑尝试包含引号会使事情复杂化,但是当分配的值没有任何空格时,引号可能是不必要的。

set condition=true

:: Some code that may change the condition
set condition=false

if %condition%==true (
    :: Some work
) ELSE (
    :: Do something else
)

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