批处理脚本 - 快速指南



批处理脚本 - 概述

批处理脚本用于自动化重复性命令序列。脚本编写是一种方法,可以通过自动化这些命令序列来简化 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 文件。

Writing Executing Method1

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

Writing Executing Method2

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

Batch Scripting Environment

环境变量

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

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

批处理脚本 - 命令

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

序号 命令和描述
1 VER

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

2 ASSOC

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

3 CD

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

4 CLS

此批处理命令清除屏幕。

5 COPY

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

6 DEL

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

7 DIR

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

8 DATE

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

9 ECHO

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

10 EXIT

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

11 MD

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

12 MOVE

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

13 PATH

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

14 PAUSE

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

15 PROMPT

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

16 RD

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

17 REN

重命名文件和目录

18 REM

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

19 START

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

20 TIME

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

21 TYPE

此批处理命令将文件内容打印到输出。

22 VOL

此批处理命令显示卷标。

23 ATTRIB

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

24 CHKDSK

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

25 CHOICE

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

26 CMD

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

27 COMP

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

28 CONVERT

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

29 DRIVERQUERY

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

30 EXPAND

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

31 FIND

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

32 FORMAT

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

33 HELP

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

34 IPCONFIG

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

35 LABEL

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

36 MORE

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

37 NET

提供各种网络服务,具体取决于所使用的命令。

38 PING

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

39 SHUTDOWN

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

40 SORT

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

41 SUBST

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

42 SYSTEMINFO

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

43 TASKKILL

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

44 TASKLIST

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

45 XCOPY

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

46 TREE

此批处理命令显示当前目录的所有子目录的树状结构,直到任何级别的递归或深度。

47 FC

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

48 DISKPART

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

49 TITLE

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

50 SET

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

批处理脚本 - 文件

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

创建批处理文件

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

:: 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。

Saving Batch Files

上面的截图显示了如何保存批处理文件。保存批处理文件时,请记住以下几点。

  • 记得在文件名末尾加上 .bat 或 .cmd。
  • 选择“保存类型”选项为“所有文件”。
  • 将整个文件名用引号“”括起来。

执行批处理文件

执行批处理文件的步骤如下:

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

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

  • 步骤 3 − 编写如下图所示的文件名,然后按 Enter 键执行批处理文件。

Executing Batch Files

修改批处理文件

修改现有批处理文件的步骤如下:

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

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

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

Modifying Batch Files

批处理脚本 - 语法

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

ECHO 命令

@echo off

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

文档

批处理文件经常包含以“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

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

Command Line Arguments

上述命令产生以下输出。

1 
2 
3

如果我们要像这样运行批处理:

Example 1 2 3 4

输出将保持与上述相同。但是,将忽略第四个参数。

Set 命令

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

语法

set /A variable-name=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 字符串连接

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

5 字符串长度

在 DOS 脚本中,没有定义用于查找字符串长度的长度函数。可以使用自定义定义的函数来实现相同的功能。以下是一个自定义定义函数的示例,用于查看字符串的长度。

6 toInt

使用 set 变量设置为字符串的变量可以使用 /A 开关转换为整数,该开关使用 set 变量。以下示例显示了如何实现此目的。

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`命令定义的变量都与数组的每个索引关联有两个值。

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

  • 我们始终检查条件:i的值是否等于len的值,如果不是,则循环执行代码。

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

输出

上述命令产生以下输出。

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

批处理脚本 - 决策

决策结构要求程序员指定一个或多个条件供程序评估或测试,以及如果条件被判断为true则要执行的语句,以及可选地,如果条件被判断为false则要执行的其他语句。

序号 字符串和描述
1 If语句

第一个决策语句是`if`语句。

2 If/else语句

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

3 嵌套If语句

有时,需要将多个`if`语句嵌套在彼此内部。以下是此语句的一般形式。

批处理脚本 - 运算符

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

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

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

算术运算符

批处理脚本语言支持与任何其他语言相同的标准算术运算符。以下是可用的算术运算符。

示例

运算符 描述 示例
+ 两个操作数相加 1 + 2 结果为 3
从第一个操作数中减去第二个操作数 2 − 1 结果为 1
* 两个操作数相乘 2 * 2 结果为 4
/ 分子除以分母 3 / 2 结果为 1.5
% 取模运算符,返回整数/浮点数除法后的余数 3 % 2 结果为 1

关系运算符

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

示例

运算符 描述 示例
EQU 测试两个对象是否相等 2 EQU 2 结果为 true
NEQ 测试两个对象是否不相等 3 NEQ 2 结果为 true
LSS 检查左操作数是否小于右操作数 2 LSS 3 结果为 true
LEQ 检查左操作数是否小于或等于右操作数 2 LEQ 3 结果为 true
GTR 检查左操作数是否大于右操作数 3 GTR 2 结果为 true
GEQ 检查左操作数是否大于或等于右操作数 3 GEQ 2 结果为 true

逻辑运算符

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

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

示例

运算符 描述
AND 这是逻辑“与”运算符
OR 这是逻辑“或”运算符
NOT 这是逻辑“非”运算符

赋值运算符

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

示例

运算符 描述 示例
+= 将右操作数添加到左操作数,并将结果赋值给左操作数

Set /A a = 5

a += 3

输出结果为 8

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

Set /A a = 5

a -= 3

输出结果为 2

*= 将右操作数乘以左操作数,并将结果赋值给左操作数

Set /A a = 5

a *= 3

输出结果为 15

/= 将左操作数除以右操作数,并将结果赋值给左操作数

Set /A a = 6

a /= 3

输出结果为 2

%= 使用两个操作数取模,并将结果赋值给左操作数

Set /A a = 5

a %= 3

输出结果为 2

位运算符

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

示例

运算符 描述
& 这是位“与”运算符
| 这是位“或”运算符
^ 这是位“异或”或“互斥或”运算符

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

p q 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

此命令获取系统日期。

语法

DATE

示例

@echo off 
echo %DATE%

输出

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

Mon 12/28/2015

TIME

此命令设置或显示时间。

语法

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:\` 的 stdout 被重定向到文件 list.txt。

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

Dir C:\ 2> list.txt

甚至可以使用文件编号和 `&` 前缀组合 stdoutstderr 流。以下是一个示例。

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

抑制程序输出

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

Dir C:\ > NUL

Stdin

要使用 Stdin,必须使用变通方法来实现这一点。这可以通过重定向命令提示符自身的 stdin(称为 CON)来完成。

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

TYPE CON > lists.txt

批处理脚本 - 返回代码

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

以下是常见的退出代码及其描述。

错误代码 描述
0 程序成功完成。
1 函数不正确。指示 Action 试图在 Windows 命令提示符 cmd.exe 中执行无法识别的命令。
2 系统找不到指定的文件。指示无法在指定位置找到该文件。
3 系统找不到指定的路径。指示找不到指定的路径。
5 访问被拒绝。指示用户无权访问指定的资源。

9009

0x2331

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

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 ` 返回自定义返回代码。

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

让我们来看一个快速示例,说明如何检查批处理文件中的错误代码。

示例

假设我们有一个名为 Find.cmd 的批处理文件,其中包含以下代码。在代码中,我们明确提到,如果找不到名为 lists.txt 的文件,则应将 errorlevel 设置为 7。同样,如果我们看到用户配置文件变量未定义,则应将 errorlevel 代码设置为 9。

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

假设我们还有另一个名为 App.cmd 的文件,它首先调用 Find.cmd。现在,如果 Find.cmd 返回一个错误,其中它将 errorlevel 设置为大于 0,则它将退出程序。在下面的批处理文件中,调用 Find.cnd 后,它实际上会检查 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 语句通常用于循环结构中,用于导致立即终止最内层的封闭循环。

批处理脚本 - 函数

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

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

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

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

函数定义

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

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

以下是简单函数的语法。

: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

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

7 创建文件

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

8 写入文件

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

9 追加到文件

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

10 从文件读取

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

11 删除文件

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

12 重命名文件

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

13 移动文件

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

14 批处理文件 - 管道

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

15 批处理文件 - 输入

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

16 使用 SHIFT 运算符

命令行参数的一个限制是它只能接受到 %9 的参数。让我们来看一下这个限制的示例。

17 文件夹

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

18 创建文件夹

文件夹的创建是在 MD(创建目录)命令的帮助下完成的。

19 列出文件夹内容

可以使用 dir 命令列出文件夹内容。此命令允许您查看当前目录中可用的文件和目录。

20 删除文件夹

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

21 重命名文件夹

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

22 移动文件夹

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

批处理脚本 - 进程

在本章中,我们将讨论批处理脚本中涉及的各种过程。

查看正在运行的进程列表

在批处理脚本中,可以使用 TASKLIST 命令获取系统中当前正在运行的进程列表。

语法

TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter]
[/FO format] [/NH]
序号 选项和描述
1.

/S system

指定要连接到的远程系统

2.

/U

[domain\]user

指定命令应在其下执行的用户上下文。

3.

/P [password]

指定给定用户上下文密码。如果省略,则提示输入。

4.

/M [module]

列出当前使用给定 exe/dll 名称的所有任务。如果未指定模块名称,则会显示所有已加载的模块。

5.

/SVC

显示每个进程中托管的服务。

6.

/V

显示详细的任务信息。

7.

/FI filter

显示一组与过滤器指定的给定条件匹配的任务。

8.

/FO format

指定输出格式。有效值:“TABLE”、“LIST”、“CSV”。

9.

/NH

指定输出中不应显示“列标题”。仅对“TABLE”和“CSV”格式有效。

示例

TASKLIST

上述命令将获取本地系统上正在运行的所有进程的列表。以下是运行上述命令时呈现的输出快照。从以下输出可以看出,您不仅可以获取系统上正在运行的各种进程,还可以获取每个进程的内存使用情况。

Image Name                    PID       Session Name       Session#     Mem Usage
========================= ========    ================ =========== ============
System Idle Process             0        Services            0              4 K
System                          4        Services            0            272 K
smss.exe                      344        Services            0          1,040 K
csrss.exe                     528        Services            0          3,892 K
csrss.exe                     612        Console             1         41,788 K
wininit.exe                   620        Services            0          3,528 K
winlogon.exe                  648        Console             1          5,884 K
services.exe                  712        Services            0          6,224 K
lsass.exe                     720        Services            0          9,712 K
svchost.exe                   788        Services            0         10,048 K
svchost.exe                   832        Services            0          7,696 K
dwm.exe                       916        Console             1        117,440 K
nvvsvc.exe                    932        Services            0          6,692 K
nvxdsync.exe                  968        Console             1         16,328 K
nvvsvc.exe                    976        Console             1         12,756 K
svchost.exe                  1012        Services            0         21,648 K
svchost.exe                   236        Services            0         33,864 K
svchost.exe                   480        Services            0         11,152 K
svchost.exe                  1028        Services            0         11,104 K
svchost.exe                  1048        Services            0         16,108 K
wlanext.exe                  1220        Services            0         12,560 K
conhost.exe                  1228        Services            0          2,588 K
svchost.exe                  1276        Services            0         13,888 K
svchost.exe                  1420        Services            0         13,488 K
spoolsv.exe                  1556        Services            0          9,340 K

tasklist > process.txt

上述命令获取 tasklist 显示的输出并将其保存到 process.txt 文件中。

tasklist /fi "memusage gt 40000"

上述命令仅获取内存大于 40MB 的那些进程。以下是可以呈现的示例输出。

Image Name                    PID      Session Name     Session#     Mem Usage
=========================   ======== ================ =========== ============
dwm.exe                        916     Console             1        127,912 K
explorer.exe                  2904     Console             1        125,868 K
ServerManager.exe             1836     Console             1         59,796 K
WINWORD.EXE                   2456     Console             1        144,504 K
chrome.exe                    4892     Console             1        123,232 K
chrome.exe                    4976     Console             1         69,412 K
chrome.exe                    1724     Console             1         76,416 K
chrome.exe                    3992     Console             1         56,156 K
chrome.exe                    1168     Console             1        233,628 K
chrome.exe                     816     Console             1         66,808 K

杀死特定进程

允许运行 Microsoft Windows XP Professional、Windows 2003 或更高版本的用戶通过进程 ID (PID) 或图像名称从 Windows 命令行终止任务。用于此目的的命令是 TASKKILL 命令。

语法

TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] 
[/PID processid | /IM imagename] } [/T] [/F]
序号 选项和描述
1.

/S system

指定要连接到的远程系统

2.

/U

[domain\]user

指定命令应在其下执行的用户上下文。

3.

/P [password]

指定给定用户上下文密码。如果省略,则提示输入。

4.

/FI

FilterName

应用过滤器以选择一组任务。允许使用“*”。例如 imagename eq acme* 请参见下面的过滤器以获取其他信息和示例。

5.

/PID

processID

指定要终止的进程的 PID。使用 TaskList 获取 PID。

6.

/IM

ImageName

指定要终止的进程的图像名称。通配符“*”可用于指定所有任务或图像名称。

7.

/T

终止指定的进程及其由其启动的任何子进程。

8.

/F

指定强制终止进程。

示例

taskkill /f /im notepad.exe

上述命令将杀死打开的记事本任务(如果已打开)。

taskill /pid 9214

上述命令将杀死进程 ID 为 9214 的进程。

启动新进程

DOS 脚本还可以启动一个全新的进程。这是通过使用 START 命令实现的。

语法

START "title" [/D path] [options] "command" [parameters]

其中

  • title - CMD 窗口标题栏的文本(必需)。

  • path - 启动目录。

  • command - 要运行的命令、批处理文件或可执行程序。

  • parameters - 传递给命令的参数。

序号 选项和描述
1.

/MIN

最小化启动窗口

2.

/MAX

最大化启动窗口。

3.

/LOW

使用空闲优先级类。

4.

/NORMAL

使用普通优先级类。

5.

/ABOVENORMAL

使用高于正常的优先级类。

6.

/BELOWNORMAL

使用低于正常的优先级类。

7.

/HIGH

使用高优先级类。

8.

/REALTIME

使用实时优先级类。

示例

START "Test Batch Script" /Min test.bat

上述命令将在新窗口中运行批处理脚本 test.bat。窗口将以最小化模式启动,并且标题为“测试批处理脚本”。

START "" "C:\Program Files\Microsoft Office\Winword.exe" "D:\test\TESTA.txt"

上述命令实际上将在另一个进程中运行 Microsoft Word,然后在 MS Word 中打开文件 TESTA.txt。

批处理脚本 - 别名

别名意味着为现有命令创建快捷方式或关键字。假设我们要执行以下命令,它只是带有 /w 选项的目录列表命令,该选项不会在目录列表中显示所有必要的详细信息。

Dir /w

假设我们要为此命令创建一个快捷方式,如下所示。

dw = dir /w

如果要执行dir /w命令,只需输入dw。现在,“dw”已成为Dir /w命令的别名。

创建别名

别名由doskey命令管理。

语法

DOSKEY [options] [macroname=[text]]

其中

  • macroname − 宏的简短名称。

  • text − 要调用的命令。

以下是可用于DOSKEY命令的选项说明。

序号 选项和描述
1.

/REINSTALL

安装新的Doskey副本。

2.

/LISTSIZE = size

设置命令历史缓冲区的大小。

3.

/MACROS

显示所有Doskey宏。

4.

/MACROS:ALL

显示所有具有Doskey宏的可执行文件的全部Doskey宏。

5.

/MACROS:exename

显示给定可执行文件的所有Doskey宏。

6.

/HISTORY

显示存储在内存中的所有命令。

7.

/INSERT

指定输入的新文本将插入到旧文本中。

8.

/OVERSTRIKE

指定新文本将覆盖旧文本。

9.

/EXENAME = exename

指定可执行文件。

10.

/MACROFILE = filename

指定要安装的宏文件。

11.

macroname

指定创建的宏的名称。

12.

text

指定要记录的命令。

示例

创建一个名为keys.bat的新文件,并在文件中输入以下命令。以下命令创建两个别名,一个用于cd命令(自动进入名为test的目录),另一个用于dir命令。

@echo off
doskey cd = cd/test
doskey d = dir

执行命令后,您可以在命令提示符下运行这些别名。

输出

以下屏幕截图显示,在执行上述创建的批处理文件后,您可以自由输入“d”命令,它将提供目录列表,这意味着您的别名已创建。

Alias Example Output

删除别名

可以通过将宏的值设置为NULL来删除别名或宏。

示例

@echo off
doskey cd = cd/test
doskey d = dir
d= 

在上面的示例中,我们首先将宏d设置为d = dir。然后将其设置为NULL。因为我们将d的值设置为NULL,所以宏d将被删除。

替换别名

可以通过将宏的值设置为新的期望值来替换别名或宏。

示例

@echo off
doskey cd = cd/test
doskey d = dir

d = dir /w

在上面的示例中,我们首先将宏d设置为d = dir。然后将其设置为dir /w。由于我们将d的值设置为新值,“d”别名现在将采用新值。

批处理脚本 - 设备

Windows现在有一个改进的库,可以在批处理脚本中用于处理连接到系统的设备。这称为设备控制台 – DevCon.exe。

Windows驱动程序开发人员和测试人员可以使用DevCon验证驱动程序是否已正确安装和配置,包括正确的INF文件、驱动程序堆栈、驱动程序文件和驱动程序包。您还可以使用DevCon命令(启用、禁用、安装、启动、停止和继续)在脚本中测试驱动程序。DevCon是一个命令行工具,可在本地计算机和远程计算机上执行设备管理功能。

显示驱动程序和设备信息 DevCon可以显示本地计算机和远程计算机(运行Windows XP及更早版本)上的驱动程序和设备的以下属性:

  • 硬件ID、兼容ID和设备实例ID。这些标识符在设备标识符字符串中有详细说明。

  • 设备安装类。

  • 设备安装类中的设备。

  • INF文件和设备驱动程序文件。

  • 驱动程序包的详细信息。

  • 硬件资源。

  • 设备状态。

  • 预期的驱动程序堆栈。

  • 驱动程序存储中的第三方驱动程序包。

  • 搜索设备 DevCon可以通过硬件ID、设备实例ID或设备安装类搜索本地或远程计算机上已安装和未安装的设备。

  • 更改设备设置 DevCon可以通过以下方式更改本地计算机上即插即用(PnP)设备的状态或配置:

    • 启用设备。

    • 禁用设备。

    • 更新驱动程序(交互式和非交互式)。

    • 安装设备(创建devnode并安装软件)。

    • 从设备树中删除设备并删除其设备堆栈。

    • 重新扫描即插即用设备。

    • 添加、删除和重新排序根枚举设备的硬件ID。

    • 更改设备安装类的上层和下层筛选器驱动程序。

    • 添加和删除驱动程序存储中的第三方驱动程序包。

安装WDK、Visual Studio和Windows SDK for desktop apps时,将包含DevCon (DevCon.exe)。安装后,DevCon.exe工具包位于以下位置:

%WindowsSdkDir%\tools\x64\devcon.exe
%WindowsSdkDir%\tools\x86\devcon.exe
%WindowsSdkDir%\tools\arm\devcon.exe

语法

devcon [/m:\\computer] [/r] command [arguments]

其中

  • /m:\\computer − 在指定的远程计算机上运行命令。反斜杠是必需的。

  • /r − 条件重新启动。仅当需要重新启动才能使更改生效时,在完成操作后重新启动系统。

  • command − 指定DevCon命令。

  • 要列出并显示有关计算机上设备的信息,请使用以下命令:

    • DevCon HwIDs

    • DevCon Classes

    • DevCon ListClass

    • DevCon DriverFiles

    • DevCon DriverNodes

    • DevCon Resources

    • DevCon Stack

    • DevCon Status

    • DevCon Dp_enum

  • 要搜索有关计算机上设备的信息,请使用以下命令:

    • DevCon Find

    • DevCon FindAll

  • 要操作设备或更改其配置,请使用以下命令:

    • DevCon Enable

    • DevCon Disable

    • DevCon Update

    • DevCon UpdateNI

    • DevCon Install

    • DevCon Remove

    • DevCon Rescan

    • DevCon Restart

    • DevCon Reboot

    • DevCon SetHwID

    • DevCon ClassFilter

    • DevCon Dp_add

    • DevCon Dp_delete

示例

以下是一些关于如何使用DevCon命令的示例。

List all driver files

以下命令使用DevCon DriverFiles操作列出系统上设备使用的驱动程序的文件名。该命令使用通配符字符(*)表示系统上的所有设备。由于输出很长,因此该命令使用重定向字符(>)将输出重定向到参考文件driverfiles.txt。

devcon driverfiles * > driverfiles.txt

以下命令使用DevCon status操作查找本地计算机上所有设备的状态。然后将其状态保存到status.txt文件中,以便记录或稍后查看。该命令使用通配符字符(*)表示所有设备,并使用重定向字符(>)将输出重定向到status.txt文件。

devcon status * > status.txt

以下命令通过在DevCon Enable命令中指定打印机安装类来启用计算机上的所有打印机设备。该命令包含/r参数,如果需要重新启动才能使启用生效,则重新启动系统。

devcon /r enable = Printer

以下命令使用DevCon Install操作在本地计算机上安装键盘设备。该命令包含设备的INF文件的完整路径(keyboard.inf)和硬件ID(*PNP030b)。

devcon /r install c:\windows\inf\keyboard.inf *PNP030b

以下命令将扫描计算机以查找新设备。

devcon scan

以下命令将重新扫描计算机以查找新设备。

devcon rescan

批处理脚本 - 注册表

注册表是Windows系统中的关键元素之一。它包含有关操作系统各个方面的大量信息。几乎所有安装在Windows系统上的应用程序都以某种形式与注册表交互。

注册表包含两个基本元素:键和值。注册表键是类似于文件夹的容器对象。注册表值是非容器对象,类似于文件。键可能包含值或其他键。键使用类似于Windows路径名的语法进行引用,使用反斜杠表示层次结构级别。

本章介绍各种功能,例如查询值、添加、删除和编辑注册表中的值。

序号 注册表类型及说明
1 从注册表读取

从注册表读取是通过REG QUERY命令完成的。

2 添加到注册表

添加到注册表是通过REG ADD命令完成的。

3 从注册表删除

从注册表删除是通过REG DEL命令完成的。

4 复制注册表键

从注册表复制是通过REG COPY命令完成的。

5 比较注册表键

比较注册表键是通过REG COMPARE命令完成的。

批处理脚本 - 网络

批处理脚本具有处理网络设置的功能。NET命令用于更新、修复或查看网络或网络设置。本章介绍NET命令可用的不同选项。

序号 NET命令及说明
1 NET ACCOUNTS

查看计算机的当前密码和登录限制。

2 NET CONFIG

显示您当前的服务器或工作组设置。

3 NET COMPUTER

添加或删除连接到Windows域控制器的计算机。

4 NET USER

此命令可用于以下用途:

查看特定用户帐户的详细信息。

5 NET STOP/START

此命令用于停止和启动特定服务。

6 NET STATISTICS

显示工作站或服务器的网络统计信息。

7 NET USE

连接或断开计算机与共享资源的连接,或显示有关连接的信息。

批处理脚本 - 打印

也可以通过NET PRINT命令在批处理脚本中控制打印。

语法

PRINT [/D:device] [[drive:][path]filename[...]]

其中/D:device - 指定打印设备。

示例

print c:\example.txt /c /d:lpt1

上述命令将example.txt文件打印到并行端口lpt1。

命令行打印机控制

从Windows 2000开始,可以使用PRINTUI.DLL和RUNDLL32.EXE从Windows命令行配置许多(但不是全部)打印机设置。

语法

RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry [ options ] [ @commandfile ]

其中一些可用选项如下:

  • /dl − 删除本地打印机。

  • /dn − 删除网络打印机连接。

  • /dd − 删除打印机驱动程序。

  • /e − 显示打印首选项。

  • /f[file] − INF文件或输出文件。

  • /F[file] − /f指定的INF文件可能依赖的INF文件的位置。

  • /ia − 使用INF文件安装打印机驱动程序。

  • /id − 使用添加打印机驱动程序向导安装打印机驱动程序。

  • /if − 使用INF文件安装打印机。

  • /ii − 使用添加打印机向导和INF文件安装打印机。

  • /il − 使用添加打印机向导安装打印机。

  • /in − 添加网络打印机连接。

  • /ip − 使用网络打印机安装向导安装打印机。

  • /k − 将测试页打印到指定的打印机,安装打印机时不能与其他命令组合使用。

  • /l[path] − 打印机驱动程序源路径。

  • /m[model] − 打印机驱动程序型号名称。

  • /n[name] − 打印机名称。

  • /o − 显示打印队列视图。

  • /p − 显示打印机属性。

  • /Ss − 将打印机设置存储到文件中。

  • /Sr − 从文件中恢复打印机设置。

  • /y − 将打印机设置为默认打印机。

  • /Xg − 获取打印机设置。

  • /Xs − 设置打印机设置。

测试打印机是否存在

您可能连接到网络打印机而不是本地打印机。在这种情况下,在打印之前先检查打印机是否存在始终是有益的。

可以使用RUNDLL32.EXE PRINTUI.DLL评估打印机是否存在,该程序用于控制大多数打印机设置。

示例

SET PrinterName = Test Printer
SET file=%TEMP%\Prt.txt
RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /Xg /n "%PrinterName%" /f "%file%" /q

IF EXIST "%file%" (
   ECHO %PrinterName% printer exists
) ELSE (
   ECHO %PrinterName% printer does NOT exists
)

上述命令将执行以下操作:

  • 它将首先设置打印机名称并设置一个文件名,该文件名将保存打印机的设置。

  • RUNDLL32.EXE PRINTUI.DLL命令将用于通过将文件的配置设置发送到Prt.txt文件来检查打印机是否实际存在。

批处理脚本 - 调试

当您处理大型复杂的批处理脚本时,调试批处理脚本变得很重要。

以下是您可以调试批处理文件的方法。

使用echo命令

一个非常简单的调试选项是在您的批处理脚本中尽可能多地使用echo命令。它将在命令提示符中显示消息,并帮助您调试出错的地方。

这是一个简单的示例,它根据给定的输入显示偶数。echo命令用于显示结果以及输入未给出时的结果。同样,当您认为可能发生错误时,可以使用echo命令代替。例如,如果给定的输入是负数、小于2等。

示例

@echo off  
if [%1] == [] ( 
   echo input value not provided 
   goto stop 
)  
rem Display numbers 
for /l %%n in (2,2,%1) do ( 
   echo %%n 
)  
:stop 
pause 

输出

C:\>test.bat 
10 
2 
4 
6 
8 
10 
22
Press any key to continue ... 

使用pause命令

另一种方法是在发生错误时暂停批处理执行。当脚本暂停时,开发人员可以修复问题并重新启动处理。

在下面的示例中,由于输入值是必需的且未提供,因此批处理脚本已暂停。

示例

@echo off  
if [%1] == [] ( 
   echo input value not provided 
   goto stop 
) else ( 
   echo "Valid value"     
)  
:stop 
pause 

输出

C:\>test.bat 
 input value not provided 
Press any key to continue.. 

将错误消息记录到另一个文件

仅查看命令提示符上显示的一堆回显来调试错误可能会很困难。另一种简单的解决方法是将这些消息记录到另一个文件中,并逐步查看它以了解出了什么问题。

这是一个示例,请考虑以下test.bat文件

net statistics /Server 

.bat文件中给出的命令是错误的。让我们记录消息并查看我们得到什么。

在您的命令行中执行以下命令

C:\>test.bat > testlog.txt 2> testerrors.txt

testerrors.txt文件将显示如下所示的错误消息

The option /SERVER is unknown.  
The syntax of this command is:  
NET STATISTICS 
[WORKSTATION | SERVER]  
More help is available by typing NET HELPMSG 3506.

查看上面的文件,开发人员可以修复程序并再次执行。

使用ErrorLevel检测错误并记录错误

如果命令成功执行,Errorlevel 返回 0;如果命令失败,则返回 1。

考虑以下示例

@echo off 
PING google.com  
if errorlevel 1 GOTO stop  
:stop 
   echo Unable to connect to google.com 
pause

在执行期间,您可以看到错误以及日志

C:\>test.bat > testlog.txt

testlog.txt

Pinging google.com [172.217.26.238] with 32 bytes of data: 
Reply from 172.217.26.238: bytes=32 time=160ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=82ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=121ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=108ms TTL=111  
Ping statistics for 172.217.26.238: 
   Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
   Minimum = 82ms, Maximum = 160ms, Average = 117ms
   Connected successfully 
Press any key to continue . . .

如果失败,您将在 testlog.txt 中看到以下日志。

Ping request could not find host google.com. Please check the name and try again. 
Unable to connect to google.com 
Press any key to continue . . .

批处理脚本 - 日志记录

可以使用重定向命令在批处理脚本中进行日志记录。

语法

test.bat > testlog.txt 2> testerrors.txt

示例

创建一个名为 test.bat 的文件,并在文件中输入以下命令。

net statistics /Server

上述命令存在错误,因为 net statistics 命令的选项使用方法错误。

输出

如果使用上述 test.bat 文件运行命令为

test.bat > testlog.txt 2> testerrors.txt

并且您打开文件 testerrors.txt,您将看到以下错误。

The option /SERVER is unknown.

此命令的语法为:

NET STATISTICS
[WORKSTATION | SERVER]

键入 NET HELPMSG 3506 可获得更多帮助。

如果您打开名为 testlog.txt 的文件,它将向您显示已执行命令的日志。

C:\tp>net statistics /Server
广告