if 命令在所有编程语言中都很常见,它只会在条件为真时执行一行或多行代码,而只有在条件为假时才会执行另一段代码。
其基本原理很简单,但是在批处理中,条件子句为true或false的实体与其他语言中的类似子句有很大不同。大多数比力操作符都是批处理所独有的,在本文中,我们将学习确定路径或文件是否存在以及是否填充变量的语法。理解计算返回代码的不同技术也很重要。
此外,我们还将了解如何有用地管理必要评估多个条件的实例,以及必要避免的一些常见问题。编写一个 if 命令非常容易,它在大多数环境下都能正常工作,但在某些条件下要么中止,要么无法按预期执行。
if 命令的底子
在其最基本的形式中,如果条件为真,if 命令执行一行或多行代码。我将演示如何使用该命令,以便在雷同条件为假的环境下执行不同的代码,不过起首让我们从它的基本结构开始。
几乎每个批处理命令实现都以命令名本身开头,后面通常跟着参数和/或选项。比方,set命令总是以这三个字母开头。通常,它后面跟一个由变量名、等号和值构成的参数,但在前面的文章中,我们了解到它在没有参数或选项的环境下也可以工作。(这样的命令会输出一个可用变量的列表。)
if 命令是特殊的。它也是以它的命令名开始,但相似之处仅限于此;它可以跨行,有两个主要构成部分。下面是其语法结构的一般形式:
if 条件 (
条件为true时执行的代码块
)
复制代码
条件是一个计算结果为true(真)或false(假)的表达式。如果它为true,解释器执行true代码块中的一条命令或多条命令,如果它为false,则不执行该代码。关于代码块的内容我们后续再深入的讨论,但是现在,我们只需了解代码块是括号之间的一行或多行代码。
使用这种语法,左括号不但必须跟在条件后面,同时它们也必须在同一行上。其他语言允许您将左括号放在下一行,并将其与右括号对齐,但这在批处理中是禁止的。但是,精良的格式要求右括号应与 if 命令的开头对齐,中间的命令应缩进。我的习惯是要求缩进三个空格,但实在任何数目的空格都可以。这里是一个例子:
if "%today%" equ "2024-09-01" (
set event=sestercentennial
)
复制代码
条件子句"%today%" equ "2024-09-01"正在查找已剖析变量和一些硬编码文本之间的相等性。这个条件子句相当简单,但我们很快就会使用不同的比力操作符、关键字甚至一个选项来演示更令人印象深刻的条件子句。许多编程语言将条件子句放在括号内;无论优劣,该子句在批处理中独立存在,括号用于括住即将执行的代码块。
如果条件子句为真,则执行代码块中的命令(在本例中为 set 命令),从而将 event 设置为 sestercentennial。
以下使用更紧凑的单行格式,在功能上等同于前面的示例:
if "%today%" equ "2024-09-01" (set event=sestercentennial)
复制代码
当使用单行时,可以不再必要括号。下面的代码在功能上等同于前面的两个例子:
if "%today%" equ "2024-09-01" set event=sestercentennial
您将在 if 命令的资助中找到以下不可或缺的关键字,但请不要搞错;这些关键词是特定于条件子句的: exist 关键字检查是否存在路径或文件,如果找到则返回true。您可以硬编码路径或文件,或者为了灵活性,您可以使用包含潜在路径或文件的变量:
if exist D:\Batch\myFile.txt set do=something
if exist %pathAndFile% set do=something
复制代码
您还可以将多个变量串在一起以构建路径或文件名。 defined 下面的条件子句使用defined关键字检查变量是否已定义—也就是说,它是否剖析为任何内容,甚至是一个空格?一个常见的错误是在变量周围使用百分号,但以下是使用该关键字的正确语法:
if defined varThatMayBeEmpty set do=something
复制代码
这在功能上相当于下面用百分号剖析变量:
if "%varThatMayBeEmpty%" neq "" set do=something
复制代码
这个关键字通常用于验证预期的输入变量。如果没有一个或多个 defined,则可以采取适当的操作,可能会启动中止。(即判断一个或多个变量是否存在,若不存在则做一些操作或者直接中止程序的启动) not 关键字在条件子句的开头使用时,否定任何条件子句。这在为尚未被其他人或其他事物设置的变量设置默认值时非常有用。比方,下面的代码确保将skyColor设置为其通常的颜色:
if 命令只有一个选项,就像我们到目前为止看到的关键字一样,它实用于条件子句。/i 选项使条件子句中的相等(和不相等)运算符不区分大小写。
为了演示,下面 if 命令中不带选项的条件子句只有在 myMood 剖析为 happy时才计算为true:
if "%myMood%" equ "happy" set do=something
复制代码
下面是添加了/i选项的雷同代码:
if /i "%myMood%" equ "happy" set do=something
复制代码
如果变量剖析为HAPPY、Happy、happy或其他可能排列中的任何一种,那么条件子句现在的计算结果为true。 注意:
/i 选项可能看起来与我已经提到的和即将出现的其他选项有些不同。如前所述,我对批处理命令使用小写,尽管大小写对解释器无关紧要。在任何环境下,选项都可以工作。尽管如此,由于选项通常只是一个正斜杠后面跟着一个字符,我通常将它们大写以示夸大。但是根据字体的不同,大写的I通常看起来像小写的L,所以我对/I选项的使用违背了我的个人习惯,它通常与 if 命令一起使用。是的,具有讽刺意味的是,这是与大小写不敏感有关的选项。
errorlevel 变量
在调用可执行文件或执行许多批处理命令之后,返回代码存储在errorlevel伪环境变量中。更多关于伪环境变量的信息我们将在后面的文章中举行先容,但是现在,将errorlevel视为一个包含返回代码的变量,您不应该使用set命令设置它。(如果这样做,就会破坏errorlevel变量。)errorlevel变量可以像批处理中的其他变量一样作为 if 命令的一部分举行计算。比方,以下代码将返回码大于等于1视为失败:
if 命令在几乎所有编码语言中都很有用,批处理也不破例。在本文中,我们学习了条件子句,包括用于比力两个操作数的有用操作符和用于证实变量、路径或文件存在的关键字,以及当子句的计算结果为true和false时发生的环境。还学习了如何对多个子句求值,以便有条件地执行多个逻辑分支。
通常环境下,批处理会给您更多的考虑,因此我详细先容了一些有用的方法,以增强您的条件子句对字母数字和数字值的比力。但是,是什么使一个值成为字母数字或数字呢?