批处理脚本 - 快速指南


批处理脚本 - 概述

批处理脚本被合并以自动执行本质上重复的命令序列。脚本编写是一种可以通过自动化这些命令序列来减轻这种必要性的方法,从而使人们在 shell 中的生活更轻松、更高效。在大多数组织中,批处理脚本以某种方式合并以实现自动化。

批处理脚本的一些功能是 -

  • 可以读取用户的输入,以便进一步处理。

  • 具有 for、if、while、switch 等控制结构,以实现更好的自动化和脚本编写。

  • 支持函数和数组等高级功能。

  • 支持正则表达式。

  • 可以包含其他编程代码,例如 Perl。

批处理脚本的一些常见用途是 -

  • 为不同目的设置服务器。

  • 自动执行内务管理活动,例如删除不需要的文件或日志文件。

  • 自动将应用程序从一种环境部署到另一种环境。

  • 同时在多台机器上安装程序。

批处理脚本存储在简单的文本文件中,其中包含命令的行,这些命令依次执行。这些文件具有特殊扩展名 BAT 或 CMD。这种类型的文件通过称为命令解释器的系统文件提供的接口(有时称为 shell)来识别和执行。在 Windows 系统上,此解释器称为 cmd.exe。

运行批处理文件非常简单,只需单击它即可。批处理文件也可以在命令提示符或“开始-运行”行中运行。在这种情况下,必须使用完整路径名,除非文件的路径位于路径环境中。以下是批处理脚本的简单示例。该批处理脚本运行时会删除当前目录中的所有文件。

:: Deletes All files in the Current Directory With Prompts and Warnings
::(Hidden, System, and Read-Only Files are Not Affected)
:: @ECHO OFF
DEL . DR

批处理脚本 - 环境

本章介绍与批处理脚本相关的环境。

编写和执行

通常,要创建批处理文件,请使用记事本。这是创建批处理文件的最简单的工具。接下来是批处理脚本的执行环境。在 Windows 系统上,这是通过命令提示符或 cmd.exe 完成的。所有批处理文件都在此环境中运行。

以下是启动 cmd.exe 的不同方法 -

方法 1 - 转到 C:\Windows\System32 并双击 cmd 文件。

编写执行方法1

方法 2 - 通过运行命令 - 以下快照显示在 Windows Server 2012 上查找命令提示符(cmd.exe)。

编写执行方法2

启动 cmd.exe 后,您将看到以下屏幕。这将是您执行批处理脚本的环境。

批处理脚本环境

环境变量

为了从命令提示符运行批处理文件,您需要转到存储批处理文件的位置,或者您可以在路径环境变量中输入文件位置。因此,假设批处理文件存储在 location 中C:\Application\bin,您需要按照这些说明来包含 PATH 变量。

操作系统 输出
Windows 追加字符串;C:\Application\bin到系统变量 PATH 的末尾。

批处理脚本 - 命令

在本章中,我们将了解一些常用的批处理命令。

序列号 命令和说明
1 版本

此批处理命令显示您正在使用的 MS-DOS 版本。

2 协会

这是一个批处理命令,用于将扩展名与文件类型 (FTYPE) 关联、显示现有关联或删除关联。

3 光盘

此批处理命令有助于更改不同的目录,或显示当前目录。

4 CLS

此批处理命令会清除屏幕。

5 复制

此批处理命令用于将文件从一个位置复制到另一个位置。

6 德尔

此批处理命令删除文件而不是目录。

7 目录

此批处理命令列出目录的内容。

8 日期

此批处理命令有助于查找系统日期。

9 回声

此批处理命令显示消息,或打开或关闭命令回显。

10 出口

该批处理命令退出 DOS 控制台。

11 医学博士

此批处理命令在当前位置创建一个新目录。

12 移动

此批处理命令在目录之间移动文件或目录。

13 小路

此批处理命令显示或设置路径变量。

14 暂停

该批处理命令提示用户并等待输入一行。

15 迅速的

此批处理命令可用于更改或重置 cmd.exe 提示符。

16 研发

此批处理命令将删除目录,但目录必须为空才能删除。

17 号

重命名文件和目录

18 快速眼动睡眠

该批处理命令用于批处理文件中的备注,防止备注的内容被执行。

19 开始

此批处理命令在新窗口中启动程序,或打开文档。

20 时间

此批处理命令设置或显示时间。

21 类型

此批处理命令将一个或多个文件的内容打印到输出。

22 音量

此批处理命令显示卷标签。

23 属性

显示或设置当前目录中文件的属性

24 CHKDSK

此批处理命令检查磁盘是否存在任何问题。

25 选择

此批处理命令向用户提供选项列表。

26 指令管理系统

此批处理命令调用命令提示符的另一个实例。

27 比较

此批处理命令根据文件大小比较 2 个文件。

28 转变

此批处理命令将卷从 FAT16 或 FAT32 文件系统转换为 NTFS 文件系统。

29 驱动查询

此批处理命令显示所有已安装的设备驱动程序及其属性。

30 扩张

此批处理命令从压缩的 .cab Cabinet 文件中提取文件。

31 寻找

此批处理命令在文件或输入中搜索字符串,输出匹配的行。

32 格式

此批处理命令将磁盘格式化为使用 Windows 支持的文件系统(例如 FAT、FAT32 或 NTFS),从而覆盖磁盘以前的内容。

33 帮助

此批处理命令显示 Windows 提供的命令列表。

34 IP配置

此批处理命令显示 Windows IP 配置。按连接显示配置以及该连接的名称。

35 标签

此批处理命令添加、设置或删除磁盘标签。

36 更多的

此批处理命令一次显示一个或多个文件的内容,一次一屏。

37

根据使用的命令提供各种网络服务。

38

此批处理命令通过网络将 ICMP/IP“回显”数据包发送到指定地址。

39 关闭

此批处理命令关闭计算机或注销当前用户。

40 种类

此批处理命令从源文件中获取输入,并按字母顺序(从 A 到 Z 或 Z 到 A)对其内容进行排序。它在控制台上打印输出。

41 SUBST

此批处理命令将驱动器号分配给本地文件夹、显示当前分配或删除分配。

42 系统信息

此批处理命令显示计算机及其操作系统的配置。

43 任务

此批处理命令结束一项或多项任务。

44 任务列表

此批处理命令列出任务,包括任务名称和进程 ID (PID)。

45 复制

此批处理命令以更高级的方式复制文件和目录。

46

此批处理命令以任何递归级别或深度显示当前目录的所有子目录的树。

47 FC

此批处理命令列出了两个文件之间的实际差异。

48 磁盘部分

此批处理命令显示并配置磁盘分区的属性。

49 标题

此批处理命令设置控制台窗口中显示的标题。

50

显示当前系统上的环境变量列表。

批处理脚本 - 文件

在本章中,我们将学习如何创建、保存、执行和修改批处理文件。

创建批处理文件

批处理文件通常在记事本中创建。因此,最简单的方法是打开记事本并输入脚本所需的命令。对于本练习,打开记事本并输入以下语句。

:: Deletes All files in the Current Directory With Prompts and Warnings 
::(Hidden, System, and Read-Only Files are Not Affected) 
:: 
@ECHO OFF 
DEL . 
DR

保存批处理文件

创建批处理文件后,下一步是保存批处理文件。批处理文件的扩展名为 .bat 或 .cmd。命名批处理文件时要记住的一些一般规则 -

  • 命名批处理文件时尽量避免使用空格,从其他脚本调用它们时有时会产生问题。

  • 不要以系统中可用的常见批处理文件(例如 ping.cmd)命名它们。

保存批处理文件

上面的屏幕截图显示了如何保存批处理文件。保存批处理文件时需要记住几点。

  • 请记住将 .bat 或 .cmd 放在文件名末尾。
  • 选择“保存类型”选项为“所有文件”。
  • 将整个文件名放在引号“”中。

执行批处理文件

以下是执行批处理文件的步骤 -

  • 步骤 1 - 打开命令提示符 (cmd.exe)。

  • 步骤 2 - 转到存储 .bat 或 .cmd 文件的位置。

  • 步骤 3 - 如下图所示写入文件名,然后按 Enter 按钮执行批处理文件。

执行批处理文件

修改批处理文件

以下是修改现有批处理文件的步骤。

  • 步骤 1 - 打开 Windows 资源管理器。

  • 步骤 2 - 转到存储 .bat 或 .cmd 文件的位置。

  • 步骤 3 - 右键单击​​该文件,然后从上下文菜单中选择“编辑”选项。该文件将在记事本中打开以进行进一步编辑。

修改批处理文件

批处理脚本 - 语法

通常,批处理文件中的第一行通常包含以下命令。

回声命令

@echo off

默认情况下,批处理文件将在运行时显示其命令。第一个命令的目的是关闭该显示。命令“echo off”关闭整个脚本的显示,“echo off”命令本身除外。前面的“at”符号“@”使该命令也适用于其自身。

文档

批处理文件通常还包含以“Rem”命令开头的行。这是输入注释和文档的一种方式。计算机会忽略 Rem 之后的行中的任何内容。对于复杂性不断增加的批处理文件,添加注释通常是一个好主意。

第一批脚本程序

让我们构建简单的第一个批处理脚本程序。打开记事本并输入以下代码行。将文件另存为“List.cmd”。

该代码执行以下操作 -

  • 使用 echo off 命令确保在执行代码时不显示命令。

  • Rem 命令用于添加注释来说明该批处理文件到底做了什么。

  • dir 命令用于获取位置 C:\Program Files 的内容。

  • “>”命令用于将输出重定向到文件 C:\lists.txt。

  • 最后用echo命令告诉用户操作完成。

@echo off 
Rem This is for listing down all the files in the directory Program files 
dir "C:\Program Files" > C:\lists.txt 
echo "The program has completed"

执行上述命令时,C:\Program Files 中的文件名将被发送到文件 C:\Lists.txt,并在命令提示符中显示“程序已完成”消息。

批处理脚本 - 变量

批处理文件中有两种类型的变量。一种是调用批处理文件时可以传递的参数,另一种是通过 set 命令完成的。

命令行参数

批处理脚本支持命令行参数的概念,其中参数可以在调用时传递到批处理文件。可以通过变量 %1、%2、%3 等从批处理文件调用参数。

以下示例显示了一个批处理文件,它接受 3 个命令行参数并将它们回显到命令行屏幕。

@echo off 
echo %1 
echo %2 
echo %3

如果上面的批处理脚本存储在名为 test.bat 的文件中,并且我们要运行该批处理:

Test.bat 1 2 3

以下是执行批处理文件时命令提示符中的外观的屏幕截图。

命令行参数

上述命令产生以下输出。

1 
2 
3

如果我们要运行批处理

Example 1 2 3 4

输出仍然与上面相同。但是,第四个参数将被忽略。

设置命令

初始化变量的另一种方法是通过“set”命令。以下是 set 命令的语法。

句法

set /A variable-name=value

在哪里,

  • 变量名称是您要设置的变量的名称。

  • value是需要针对变量设置的值。

  • /A –如果值本质上需要是数字,则使用此开关。

以下示例显示了使用 set 命令的简单方法。

例子

@echo off 
set message=Hello World 
echo %message%
  • 在上面的代码片段中,定义了一个名为 message 的变量,并设置了值“Hello World”。

  • 要显示变量的值,请注意变量需要用% 符号括起来。

输出

上述命令产生以下输出。

Hello World

使用数值

在批处理脚本中,还可以定义一个变量来保存数值。这可以通过使用 /A 开关来完成。

以下代码显示了使用 /A 开关设置数值的简单方法。

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c%
  • 我们首先将 2 个变量 a 和 b 的值分别设置为 5 和 10。

  • 我们将这些值相加并存储在变量 c 中。

  • 最后,我们显示变量 c 的值。

上述程序的输出为 15。

所有算术运算符都在批处理文件中工作。以下示例显示可以在批处理文件中使用算术运算符。

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c% 
SET /A c = %a% - %b% 
echo %c% 
SET /A c = %b% / %a% 
echo %c% 
SET /A c = %b% * %a% 
echo %c%

上述命令产生以下输出。

15 
-5 
2 
50

局部变量与全局变量

在任何编程语言中,都可以选择将变量标记为具有某种范围,即可以访问变量的代码部分。通常,具有全局作用域的变量可以从程序的任何地方访问,而局部作用域的变量具有可以访问它们的已定义边界。

DOS 脚本也有本地和全局变量的定义。默认情况下,变量对于整个命令提示符会话是全局的。调用 SETLOCAL 命令使变量成为脚本范围的本地变量。调用 SETLOCAL 后,任何变量分配都会在调用 ENDLOCAL、调用 EXIT 或执行到脚本中的文件末尾 (EOF) 时恢复。以下示例显示了在脚本中设置局部变量和全局变量时的差异。

例子

@echo off 
set globalvar = 5
SETLOCAL
set var = 13145
set /A var = %var% + 5
echo %var%
echo %globalvar%
ENDLOCAL

关于上述程序,有几个关键事项需要注意。

  • “globalvar”是用全局范围定义的,并且在整个脚本中可用。

  • 'var' 变量是在本地范围内定义的,因为它包含在 'SETLOCAL' 和 'ENDLOCAL' 块之间。因此,一旦执行“ENDLOCAL”语句,该变量就会被销毁。

输出

上述命令产生以下输出。

13150
5

您会注意到命令 echo %var% 不会产生任何结果,因为在 ENDLOCAL 语句之后,“var”变量将不再存在。

使用环境变量

如果您有要在批处理文件中使用的变量,那么最好使用环境变量。一旦定义了环境变量,就可以通过%符号来访问它。以下示例显示如何查看系统上定义的 JAVA_HOME。JAVA_HOME 变量是一个关键组件,通常被各种应用程序使用。

@echo off 
echo %JAVA_HOME%

输出将显示 JAVA_HOME 目录,该目录取决于系统。以下是输出示例。

C:\Atlassian\Bitbucket\4.0.1\jre

批处理脚本 - 注释

为创建的脚本添加注释或文档始终是一个好习惯。这是维护脚本以了解脚本实际用途所必需的。

例如,考虑以下没有任何形式注释的代码。如果任何没有开发过以下脚本的普通人试图理解该脚本,那么该人将需要花费大量时间才能理解该脚本的实际用途。

ECHO OFF 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
ECHO.%* | FIND "?" >NUL 
IF NOT ERRORLEVEL 1 GOTO Syntax 
IF NOT [%2]==[] GOTO Syntax 
SETLOCAL 
SET WSS= 
IF NOT [%1]==[] FOR /F "tokens = 1 delims = \ " %%A IN ('ECHO.%~1') DO SET WSS = %%A 
FOR /F "tokens = 1 delims = \ " %%a IN ('NET VIEW ^| FIND /I "\\%WSS%"') DO FOR /F 
"tokens = 1 delims = " %%A IN ('NBTSTAT -a %%a ^| FIND /I /V "%%a" ^| FIND "<03>"') 
DO ECHO.%%a %%A 
ENDLOCAL 
GOTO:EOF 
ECHO Display logged on users and their workstations. 
ECHO Usage: ACTUSR [ filter ] 
IF "%OS%"=="Windows_NT" ECHO Where: filter is the first part 
of the computer name^(s^) to be displayed

使用 Rem 语句的注释

在批处理脚本中创建注释有两种方法;一种是通过 Rem 命令。Rem 语句后面的任何文本都将被视为注释并且不会被执行。以下是该语句的一般语法。

句法

Rem Remarks

其中“备注”是需要添加的注释。

以下示例显示了使用Rem命令的简单方法。

例子

@echo off 
Rem This program just displays Hello World 
set message=Hello World 
echo %message%

输出

上述命令产生以下输出。您会注意到带有 Rem 语句的行将不会被执行。

Hello World

使用 :: 声明的评论

在批处理脚本中创建注释的另一种方法是通过 :: 命令。:: 语句后面的任何文本都将被视为注释并且不会被执行。以下是该语句的一般语法。

句法

:: Remarks

其中“备注”是需要添加的注释。

以下示例显示了使用 Rem 命令的简单方法。

例子

@echo off 
:: This program just displays Hello World 
set message = Hello World 
echo %message%

输出

上述命令产生以下输出。您会注意到带有 :: 语句的行将不会被执行。

Hello World

注意- 如果 Rem 行太多,可能会减慢代码速度,因为最终仍然需要执行批处理文件中的每一行代码。

让我们看一下在本主题开头看到的大型脚本示例,看看添加文档后它的外观如何。

::===============================================================
:: The below example is used to find computer and logged on users
::
::===============================================================
ECHO OFF 
:: Windows version check 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
ECHO.%* | FIND "?" >NUL 
:: Command line parameter check 
IF NOT ERRORLEVEL 1 GOTO Syntax
IF NOT [%2]==[] GOTO Syntax 
:: Keep variable local 
SETLOCAL 
:: Initialize variable 
SET WSS= 
:: Parse command line parameter 
IF NOT [%1]==[] FOR /F "tokens = 1 delims = \ " %%A IN ('ECHO.%~1') DO SET WSS = %%A 
:: Use NET VIEW and NBTSTAT to find computers and logged on users 
FOR /F "tokens = 1 delims = \ " %%a IN ('NET VIEW ^| FIND /I "\\%WSS%"') DO FOR /F 
"tokens = 1 delims = " %%A IN ('NBTSTAT -a %%a ^| FIND /I /V "%%a" ^| FIND 
"<03>"') DO ECHO.%%a %%A 
:: Done 
ENDLOCAL
GOTO:EOF 
:Syntax 
ECHO Display logged on users and their workstations. 
ECHO Usage: ACTUSR [ filter ] 
IF "%OS%"=="Windows_NT" ECHO Where: filter is the first part of the 
computer name^(s^) to be displayed

现在您可以看到,对于没有开发过代码的用户来说,代码变得更容易理解,因此更易于维护。

批处理脚本 - 字符串

在 DOS 中,字符串是字符的有序集合,例如“Hello, World!”。

序列号 字符串和描述
1 创建字符串

可以通过以下方式在 DOS 中创建字符串。

2 空字符串

空字符串

3 字符串插值

字符串插值是一种通过将常量、变量、文字和表达式的值包含在字符串文字中来构造新字符串值的方法。

4 字符串连接

您可以使用集合运算符连接两个字符串或一个字符串和一个字符或两个字符。以下是一个简单的示例,展示了如何使用字符串连接。

5 字符串长度

在 DOS 脚本中,没有定义用于查找字符串长度的长度函数。有一些自定义函数可用于相同目的。以下是用于查看字符串长度的自定义函数的示例。

6 至整数

使用设置变量设置为字符串的变量可以使用使用设置变量的 /A 开关转换为整数。以下示例展示了如何实现这一点。

7 右对齐

这用于将文本向右对齐,通常用于提高数字列的可读性。

8 左弦

这用于从字符串的开头提取字符。

9 中弦

这用于通过字符串中字符的位置提取子字符串。

10 消除

字符串替换功能还可用于从另一个字符串中删除子字符串。

11 去掉两端

这用于删除字符串的第一个和最后一个字符。

12 删除所有空格

这用于通过替换删除字符串中的所有空格。

13 替换字符串

要将子字符串替换为另一个字符串,请使用字符串替换功能。

14 右弦

这用于从字符串末尾提取字符。

批处理脚本 - 数组

数组在批处理脚本中并未明确定义为类型,但可以实现。在批处理脚本中实现数组时需要注意以下事项。

  • 数组的每个元素都需要使用 set 命令来定义。
  • 需要“for”循环来迭代数组的值。

创建数组

使用以下 set 命令创建数组。

set a[0]=1

其中 0 是数组的索引,1 是分配给数组第一个元素的值。

实现数组的另一种方法是定义值列表并迭代该值列表。以下示例展示了如何实现这一点。

例子

@echo off 
set list = 1 2 3 4 
(for %%a in (%list%) do ( 
   echo %%a 
))

输出

上述命令产生以下输出。

1
2
3
4

访问数组

您可以使用下标语法从数组中检索值,在数组名称后面的方括号内传递要检索的值的索引。

例子

@echo off 
set a[0]=1 
echo %a[0]%

在这个例子中,索引从0开始,这意味着可以使用索引为0来访问第一个元素,可以使用索引为1来访问第二个元素,依此类推。让我们检查以下示例来创建、初始化和访问数组 -

@echo off
set a[0] = 1 
set a[1] = 2 
set a[2] = 3 
echo The first element of the array is %a[0]% 
echo The second element of the array is %a[1]% 
echo The third element of the array is %a[2]%

上述命令产生以下输出。

The first element of the array is 1 
The second element of the array is 2 
The third element of the array is 3

修改数组

要将元素添加到数组末尾,可以使用 set 元素以及数组元素的最后一个索引。

例子

@echo off 
set a[0] = 1  
set a[1] = 2  
set a[2] = 3 
Rem Adding an element at the end of an array 
Set a[3] = 4 
echo The last element of the array is %a[3]%

上述命令产生以下输出。

The last element of the array is 4

您可以通过在给定索引处分配新值来修改数组的现有元素,如下例所示 -

@echo off 
set a[0] = 1 
set a[1] = 2  
set a[2] = 3 
Rem Setting the new value for the second element of the array 
Set a[1] = 5 
echo The new value of the second element of the array is %a[1]%

上述命令产生以下输出。

The new value of the second element of the array is 5

迭代数组

迭代数组是通过使用“for”循环并遍历数组的每个元素来实现的。以下示例显示了实现数组的简单方法。

@echo off 
setlocal enabledelayedexpansion 
set topic[0] = comments 
set topic[1] = variables 
set topic[2] = Arrays 
set topic[3] = Decision making 
set topic[4] = Time and date 
set topic[5] = Operators 

for /l %%n in (0,1,5) do ( 
   echo !topic[%%n]! 
)

关于上述程序需要注意以下事项 -

  • 数组的每个元素都需要使用 set 命令专门定义。

  • 带有 /L 参数的“for”循环用于在范围内移动,用于迭代数组。

输出

上述命令产生以下输出。

Comments 
variables 
Arrays 
Decision making 
Time and date 
Operators

数组的长度

数组的长度是通过迭代数组中的值列表来确定的,因为没有直接的函数来确定数组中的元素数量。

@echo off 
set Arr[0] = 1 
set Arr[1] = 2 
set Arr[2] = 3 
set Arr[3] = 4 
set "x = 0" 
:SymLoop 

if defined Arr[%x%] ( 
   call echo %%Arr[%x%]%% 
   set /a "x+=1"
   GOTO :SymLoop 
)
echo "The length of the array is" %x%

输出

输出 上述命令产生以下输出。

The length of the array is 4

在数组中创建结构

结构也可以在批处理文件中实现,使用一点额外的编码来实现。以下示例展示了如何实现这一点。

例子

@echo off 
set len = 3 
set obj[0].Name = Joe 
set obj[0].ID = 1 
set obj[1].Name = Mark 
set obj[1].ID = 2 
set obj[2].Name = Mohan 
set obj[2].ID = 3 
set i = 0 
:loop 

if %i% equ %len% goto :eof 
set cur.Name= 
set cur.ID=

for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do ( 
   set cur.%%k=%%l 
) 
echo Name = %cur.Name% 
echo Value = %cur.ID% 
set /a i = %i%+1 
goto loop

关于上述代码,需要注意以下关键事项。

  • 使用 set 命令定义的每个变量都有 2 个与数组的每个索引关联的值。

  • 变量i设置为 0,以便我们可以循环遍历该结构,将数组的长度设置为 3。

  • 我们总是检查 i 的值是否等于len的值,如果不等于,我们循环执行代码。

  • 我们可以使用 obj[%i%] 表示法访问结构的每个元素。

输出

上述命令产生以下输出。

Name = Joe 
Value = 1 
Name = Mark 
Value = 2 
Name = Mohan 
Value = 3

批处理脚本 - 决策

决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及在条件确定为 true 时要执行的一条或多条语句,以及可选的在条件成立时要执行的其他语句。条件被确定为false

序列号 字符串和描述
1 如果语句

第一个决策语句是“if”语句。

2 如果/否则语句

下一个决策语句是 If/else 语句。以下是该声明的一般形式。

3 嵌套 If 语句

有时,需要将多个“if”语句嵌入其中。以下是该声明的一般形式。

批处理脚本 - 运算符

运算符是告诉编译器执行特定数学或逻辑操作的符号。

在批处理脚本中,可以使用以下类型的运算符。

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 赋值运算符
  • 按位运算符

算术运算符

批处理脚本语言支持任何语言的普通算术运算符。以下是可用的算术运算符。

显示示例

操作员 描述 例子
+ 两个操作数相加 1 + 2 将得到 3
- 从第一个操作数中减去第二个操作数 2 − 1 将给出 1
* 两个操作数相乘 2 * 2 将得到 4
/ 分子除以分母 3 / 2 将给出 1.5
% 模运算符和整数/浮点除法后的余数 3 % 2 将给出 1

关系运算符

关系运算符允许对对象进行比较。以下是可用的关系运算符。

显示示例

操作员 描述 例子
均衡器 测试两个对象之间的相等性 2 EQU 2 将给出 true
新EQ 测试两个对象之间的差异 3 NEQ 2 将给出 true
LSS 检查左侧对象是否小于右侧操作数 2 LSS 3 将给出 true
LEQ 检查左侧对象是否小于或等于右侧操作数 2 LEQ 3 将给出 true
GTR 检查左侧对象是否大于右侧操作数 3 GTR 2 将给出真实的
图形均衡器 检查左侧对象是否大于或等于右侧操作数 3 GEQ 2 将给出真实的

逻辑运算符

逻辑运算符用于计算布尔表达式。以下是可用的逻辑运算符。

批处理语言配备了一整套布尔逻辑运算符,如 AND、OR、XOR,但仅适用于二进制数。也没有任何 TRUE 或 FALSE 值。可用于条件的唯一逻辑运算符是 NOT 运算符。

显示示例

操作员 描述
这是逻辑“与”运算符
或者 这是逻辑“或”运算符
不是 这是逻辑“非”运算符

赋值运算符

批处理脚本语言还提供赋值运算符。以下是可用的赋值运算符。

显示示例

操作员 描述 例子
+= 这会将右操作数添加到左操作数并将结果分配给左操作数

设 /A a = 5

一个+= 3

输出将为 8

-= 这会从左操作数中减去右操作数,并将结果赋给左操作数

设 /A a = 5

一个 -= 3

输出将为 2

*= 这会将右操作数与左操作数相乘,并将结果赋给左操作数

设 /A a = 5

一个 *= 3

输出将为 15

/= 将左操作数与右操作数相除,并将结果赋给左操作数

设 /A a = 6

一个/ = 3

输出将为 2

%= 这使用两个操作数取模并将结果分配给左侧操作数

设 /A a = 5

%=3

输出将为 2

按位运算符

位运算符也可以在批处理脚本中使用。以下是可用的运算符。

显示示例

操作员 描述
& 这是按位“与”运算符
| 这是按位“或”运算符
^ 这是按位“异或”或异或运算符

以下是显示这些运算符的真值表。

p q 质与问 p| q p^q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

批处理脚本 - 日期和时间

DOS 脚本中的日期和时间有以下两个基本命令用于检索系统的日期和时间。

日期

该命令获取系统日期。

句法

DATE

例子

@echo off 
echo %DATE%

输出

当前日期将显示在命令提示符中。例如,

Mon 12/28/2015

时间

该命令设置或显示时间。

句法

TIME

例子

@echo off 
echo %TIME%

输出

将显示当前系统时间。例如,

22:06:52.87

以下是一些可用于获取不同格式的日期和时间的实现。

格式为年-月-日的日期

例子

@echo off 
echo/Today is: %year%-%month%-%day% 
goto :EOF 
setlocal ENABLEEXTENSIONS 
set t = 2&if "%date%z" LSS "A" set t = 1 

for /f "skip=1 tokens = 2-4 delims = (-)" %%a in ('echo/^|date') do ( 
   for /f "tokens = %t%-4 delims=.-/ " %%d in ('date/t') do ( 
      set %%a=%%d&set %%b=%%e&set %%c=%%f)) 
endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF

输出

上述命令产生以下输出。

Today is: 2015-12-30

批处理脚本 - 输入/输出

共有三个通用“文件”用于键盘输入、在屏幕上打印文本以及在屏幕上打印错误。“标准输入”文件称为stdin,包含程序/脚本的输入。“标准输出”文件称为stdout,用于写入输出以在屏幕上显示。最后,“标准错误”文件(称为stderr)包含要在屏幕上显示的所有错误消息。

这三个标准文件中的每一个(也称为标准流)均使用数字 0、1 和 2 进行引用。Stdin 是文件 0,stdout 是文件 1,stderr 是文件 2。

重定向输出(Stdout 和 Stderr)

批处理文件的一种常见做法是将程序的输出发送到日志文件。> 运算符将 stdout 或 stderr 发送或重定向到另一个文件。以下示例展示了如何完成此操作。

Dir C:\ > list.txt

在上面的示例中,命令 Dir C:\ 的标准输出被重定向到文件 list.txt。

如果将数字 2 附加到重定向过滤器,那么它会将stderr重定向到文件lists.txt。

Dir C:\ 2> list.txt

甚至可以使用文件号和“&”前缀组合stdoutstderr流。下面是一个例子。

DIR C:\ > lists.txt 2>&1

抑制程序输出

伪文件 NUL 用于丢弃程序的任何输出。以下示例显示通过将输出发送到 NUL 来丢弃命令 DIR 的输出。

Dir C:\ > NUL

标准输入

要使用标准输入,您必须使用解决方法来实现此目的。这可以通过重定向命令提示符自己的标准输入(称为 CON)来完成。

以下示例显示如何将输出重定向到名为lists.txt 的文件。执行以下命令后,命令提示符将接受用户输入的所有输入,直到获得 EOF 字符。随后,它将所有输入发送到文件lists.txt。

TYPE CON > lists.txt

批处理脚本 - 返回代码

默认情况下,当命令行执行完成时,执行成功时应返回零,执行失败时应返回非零。当批处理脚本执行失败后返回非零值时,该非零值将指示错误号是多少。然后,我们将使用错误号来确定错误的原因并相应地解决它。

以下是常见的退出代码及其说明。

错误代码 描述
0 计划顺利完成。
1 功能不正确。指示操作尝试在 Windows 命令提示符 cmd.exe 中执行无法识别的命令。
2 该系统找不到指定的文件。表示在指定位置找不到该文件。
3 该系统找不到指定的路径。表示找不到指定的路径。
5 访问被拒绝。表示用户没有指定资源的访问权限。

9009

0x2331

程序不被识别为内部或外部命令、可操作程序或批处理文件。指示配置操作时命令、应用程序名称或路径拼写错误。

221225495

0xC0000017

-1073741801

没有足够的虚拟内存可用。

它表明 Windows 内存不足。

3221225786

0xC000013A

-1073741510

应用程序因 CTRL+C 而终止。指示应用程序已通过用户键盘输入 CTRL+C 或 CTRL+Break 或关闭命令提示符窗口终止。

3221225794

0xC0000142

-1073741502

该应用程序未能正确初始化。指示应用程序已在当前用户无访问权限的桌面上启动。另一个可能的原因是 gdi32.dll 或 user32.dll 初始化失败。

错误级别

环境变量 %ERRORLEVEL% 包含最后执行的程序或脚本的返回代码。

默认情况下,检查 ERRORLEVEL 的方法是通过以下代码。

句法

IF %ERRORLEVEL% NEQ 0 ( 
   DO_Something 
)

通常在批处理文件末尾使用命令 EXIT /B %ERRORLEVEL% 从批处理文件返回错误代码。

批处理文件末尾的 EXIT /B 将停止批处理文件的执行。

在批处理文件末尾使用 EXIT /B < exitcodes > 可返回自定义返回代码。

环境变量 %ERRORLEVEL% 包含批处理文件中的最新错误级别,即上次执行的命令的最新错误代码。在批处理文件中,使用环境变量而不是常量值始终是一个好习惯,因为相同的变量在不同的计算机上会扩展为不同的值。

让我们看一个有关如何从批处理文件中检查错误代码的简单示例。

例子

假设我们有一个名为 Find.cmd 的批处理文件,其中包含以下代码。在代码中,我们已经明确提到,如果没有找到名为lists.txt的文件,那么我们应该将错误级别设置为7。同样,如果我们看到变量userprofile没有定义,那么我们应该将错误级别代码设置为9.

if not exist c:\lists.txt exit 7 
if not defined userprofile exit 9 
exit 0

假设我们有另一个名为 App.cmd 的文件,它首先调用 Find.cmd。现在,如果 Find.cmd 返回一个错误,其中它将错误级别设置为大于 0,那么它将退出程序。在下面的批处理文件中,调用 Find.cnd find 后,它实际上检查 errorlevel 是否大于 0。

Call Find.cmd

if errorlevel gtr 0 exit 
echo “Successful completion”

输出

在上面的程序中,我们可以将以下场景作为输出 -

  • 如果文件 c:\lists.txt 不存在,则控制台输出中不会显示任何内容。

  • 如果变量 userprofile 不存在,则控制台输出中不会显示任何内容。

  • 如果上述两个条件都满足,则命令提示符中将显示字符串“成功完成”。

循环

在决策一章中,我们看到了以顺序方式一个接一个执行的语句。此外,还可以在批处理脚本中完成实现,以改变程序逻辑中的控制流。然后将它们分类为控制语句流。

序列号 循环和描述
1 While 语句实现

批处理脚本中没有直接的 while 语句,但我们可以通过使用 if 语句和标签非常轻松地实现此循环。

2 For 语句 - 列表实现

“FOR”结构为批处理文件提供循环功能。以下是用于处理值列表的“for”语句的常见结构。

3 循环范围

“for”语句还能够在一系列值之间移动。以下是声明的一般形式。

4 经典的 for 循环实现

以下是大多数编程语言中都可用的经典“for”语句。

循环遍历命令行参数

“for”语句也可用于检查命令行参数。以下示例显示如何使用“for”语句循环遍历命令行参数。

例子

@ECHO OFF 
:Loop 

IF "%1"=="" GOTO completed 
FOR %%F IN (%1) DO echo %%F 
SHIFT 
GOTO Loop 
:completed

输出

假设上面的代码存储在名为 Test.bat 的文件中。如果批处理文件将命令行参数 1,2 和 3 作为 Test.bat 1 2 3 传递,则上述命令将产生以下输出。

1 
2 
3

序列号 循环和描述
1 Break语句的实现

Break 语句用于改变任何编程语言中循环内部的控制流。Break 语句通常用在循环结构中,用于立即终止最内层的封闭循环。

批处理脚本 - 函数

函数是组织在一起以执行特定任务的一组语句。在批处理脚本中,采用类似的方法将逻辑语句组合在一起形成一个函数。

与任何其他语言一样,批处理脚本中的函数遵循相同的过程 -

  • 函数声明- 它告诉编译器函数的名称、返回类型和参数。

  • 函数定义- 它提供函数的实际主体。

功能定义

在批处理脚本中,函数是通过使用标签语句来定义的。当一个函数被新定义时,它可以将一个或多个值作为函数的输入“参数”,在主体中处理函数,并将这些值作为输出“返回类型”传递回函数。

每个函数都有一个函数名称,它描述了该函数执行的任务。要使用函数,您可以使用函数名称“调用”该函数,并传递与函数参数类型匹配的输入值(称为参数)。

以下是一个简单函数的语法。

:function_name 
Do_something 
EXIT /B 0
  • function_name 是赋予函数的名称,它应该具有一定的含义以匹配函数的实际功能。

  • EXIT 语句用于确保函数正确退出。

以下是一个简单函数的示例。

例子

:Display 
SET /A index=2 
echo The value of index is %index% 
EXIT /B 0
序列号 功能及说明
1 调用函数

使用 call 命令在批处理脚本中调用函数。

2 带参数的函数

函数可以通过在调用函数时简单地传递参数来使用参数。

3 有返回值的函数

函数可以通过简单地传递变量名称来处理返回值

4 函数中的局部变量

函数中的局部变量可用于避免名称冲突并将变量更改保留在函数本地。

5 递归函数

通过将变量更改保留在函数本地并对调用者不可见来完全封装函数体的能力。

6 文件输入/输出

在批处理脚本中,可以执行任何编程语言中预期的正常文件 I/O 操作。

7 创建文件

新文件的创建是在重定向过滤器 > 的帮助下完成的。此过滤器可用于将任何输出重定向到文件。

8 写入文件

内容写入文件也是在重定向过滤器的帮助下完成的。此过滤器可用于将任何输出重定向到文件。

9 附加到文件

内容写入文件也是在双重定向过滤器>>的帮助下完成的。该过滤器可用于将任何输出附加到文件中。

10 从文件中读取

批处理脚本中文件的读取是通过使用 FOR 循环命令遍历需要读取的文件中定义的每一行来完成的。

11 删除文件

为了删除文件,批处理脚本提供了 DEL 命令。

12 重命名文件

对于重命名文件,批处理脚本提供了 REN 或 RENAME 命令。

13 移动文件

对于移动文件,批处理脚本提供了 MOVE 命令。

14 批处理文件 – 管道

管道运算符 (|) 获取一个命令的输出(默认情况下为 STDOUT)并将其定向到另一命令的输入(默认情况下为 STDIN)。

15 批处理文件 - 输入

运行批处理文件时,您可以选择传递命令行参数,然后可以在程序中读取这些参数以进行进一步处理。

16 使用 SHIFT 运算符

命令行参数的限制之一是它只能接受 %9 之前的参数。让我们举一个例子来说明这个限制。

17 号 文件夹

在批处理脚本中,可以执行任何编程语言中预期的基于文件夹的正常操作。

18