批处理脚本 – 快速指南
批处理脚本 – 快速指南
批处理脚本 – 概述
批处理脚本被合并以自动化本质上重复的命令序列。脚本编写是一种可以通过自动化这些命令序列来减轻这种必要性的方式,从而使人们在 shell 中的生活更轻松、更高效。在大多数组织中,批处理脚本以某种方式合并以实现自动化。
批处理脚本的一些功能是 –
-
可以读取用户的输入,以便进一步处理。
-
具有控制结构,例如 for、if、while、switch 以实现更好的自动化和脚本编写。
-
支持函数和数组等高级功能。
-
支持正则表达式。
-
可以包含其他编程代码,例如 Perl。
批处理脚本的一些常见用途是 –
-
为不同的目的设置服务器。
-
自动化内务管理活动,例如删除不需要的文件或日志文件。
-
自动将应用程序从一个环境部署到另一个环境。
-
一次在各种机器上安装程序。
批处理脚本存储在简单的文本文件中,其中包含的命令行一个接一个地依次执行。这些文件具有特殊的扩展名 BAT 或 CMD。这种类型的文件通过称为命令解释器的系统文件提供的接口(有时称为外壳)识别和执行。在 Windows 系统上,此解释器称为 cmd.exe。
运行批处理文件很简单,只需单击它即可。批处理文件也可以在命令提示符或开始运行行中运行。在这种情况下,除非文件的路径在路径环境中,否则必须使用完整路径名。以下是批处理脚本的简单示例。运行时此批处理脚本会删除当前目录中的所有文件。
:: Deletes All files in the Current Directory With Prompts and Warnings ::(Hidden, System, and Read-Only Files are Not Affected) :: &commatECHO OFF DEL . DR
批处理脚本 – 环境
本章介绍与 Batch Script 相关的环境。
编写和执行
通常,要创建批处理文件,使用记事本。这是用于创建批处理文件的最简单的工具。接下来是批处理脚本的执行环境。在 Windows 系统上,这是通过命令提示符或 cmd.exe 完成的。所有批处理文件都在此环境中运行。
以下是启动 cmd.exe 的不同方法 –
方法 1 – 转到 C:\Windows\System32 并双击 cmd 文件。
方法 2 – 通过运行命令 – 以下快照显示在 Windows Server 2012 上查找命令提示符(cmd.exe)。
cmd.exe 启动后,您将看到以下屏幕。这将是您执行批处理脚本的环境。
环境变量
为了从命令提示符运行批处理文件,您需要转到存储批处理文件的位置,或者您可以在路径环境变量中输入文件位置。因此,假设批处理文件存储在 location 中C:\Application\bin
,您需要按照这些说明来包含 PATH 变量。
OS | 输出 |
---|---|
Windows | 追加字符串;C:\Application\bin 到系统变量PATH的末尾。 |
批处理脚本 – 命令
在本章中,我们将了解一些常用的批处理命令。
S.No | 命令和说明 |
---|---|
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
This batch command checks the disk for any problems. |
25 | CHOICE
此批处理命令为用户提供选项列表。 |
26 | CMD
此批处理命令调用命令提示符的另一个实例。 |
27 | COMP
此批处理命令根据文件大小比较 2 个文件。 |
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“echo”数据包。 |
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) :: &commatECHO OFF DEL . DR
保存批处理文件
创建批处理文件后,下一步是保存批处理文件。批处理文件的扩展名为 .bat 或 .cmd。命名批处理文件时要记住的一些一般规则 –
-
命名批处理文件时尽量避免使用空格,有时从其他脚本调用它们时会产生问题。
-
不要以系统中可用的常见批处理文件(例如 ping.cmd)命名它们。
上面的屏幕截图显示了如何保存批处理文件。保存批处理文件时要记住几点。
- 请记住将 .bat 或 .cmd 放在文件名的末尾。
- 选择“保存类型”选项为“所有文件”。
- 将整个文件名放在引号“”中。
执行批处理文件
以下是执行批处理文件的步骤 –
-
步骤 1 – 打开命令提示符 (cmd.exe)。
-
步骤 2 – 转到存储 .bat 或 .cmd 文件的位置。
-
步骤 3 – 如下图所示写入文件名,然后按 Enter 按钮执行批处理文件。
修改批处理文件
以下是修改现有批处理文件的步骤。
-
步骤 1 – 打开 Windows 资源管理器。
-
步骤 2 – 转到存储 .bat 或 .cmd 文件的位置。
-
步骤 3 – 右键单击文件并从上下文菜单中选择“编辑”选项。该文件将在记事本中打开以进行进一步编辑。
批处理脚本 – 语法
通常,批处理文件的第一行通常包含以下命令。
回显命令
&commatecho off
默认情况下,批处理文件将在运行时显示其命令。第一个命令的目的是关闭此显示。命令“echo off”关闭整个脚本的显示,除了“echo off”命令本身。前面的“at”符号“&commat”使命令也适用于自身。
文档
批处理文件通常还包含以“Rem”命令开头的行。这是一种输入注释和文档的方式。计算机忽略 Rem 后面一行上的任何内容。对于越来越复杂的批处理文件,添加注释通常是个好主意。
第一批脚本程序
让我们构建我们简单的第一个批处理脚本程序。打开记事本并输入以下代码行。将文件另存为“List.cmd”。
代码执行以下操作 –
-
使用 echo off 命令确保在执行代码时不显示命令。
-
Rem 命令用于添加注释以说明此批处理文件的作用。
-
dir 命令用于获取位置 C:\Program Files 的内容。
-
‘>’ 命令用于将输出重定向到文件 C:\lists.txt。
-
最后,使用echo 命令告诉用户操作完成。
&commatecho 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 个命令行参数并将它们回显到命令行屏幕。
&commatecho 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
在哪里,
-
variable-name是您要设置的变量的名称。
-
value是需要针对变量设置的值。
-
/A –如果值本质上需要是数字,则使用此开关。
以下示例显示了可以使用 set 命令的简单方法。
例子
&commatecho off set message=Hello World echo %message%
-
在上面的代码片段中,定义了一个名为 message 的变量并将其设置为“Hello World”。
-
要显示变量的值,请注意变量需要用 % 符号括起来。
输出
上述命令产生以下输出。
Hello World
使用数值
在批处理脚本中,还可以定义一个变量来保存数值。这可以通过使用 /A 开关来完成。
下面的代码显示了一种可以使用 /A 开关设置数值的简单方法。
&commatecho off SET /A a = 5 SET /A b = 10 SET /A c = %a% &plus %b% echo %c%
-
我们首先将 2 个变量 a 和 b 的值分别设置为 5 和 10。
-
我们将这些值相加并存储在变量 c 中。
-
最后,我们显示变量 c 的值。
上述程序的输出将是 15。
所有算术运算符都在批处理文件中工作。以下示例显示了可以在批处理文件中使用的算术运算符。
&commatecho off SET /A a = 5 SET /A b = 10 SET /A c = %a% &plus %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) 时恢复。以下示例显示了在脚本中设置局部变量和全局变量时的区别。
例子
&commatecho 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 变量是一个关键组件,通常被各种应用程序使用。
&commatecho off echo %JAVA_HOME%
输出将显示 JAVA_HOME 目录,该目录取决于系统。以下是一个输出示例。
C:\Atlassian\Bitbucket.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命令的简单方法。
例子
&commatecho off Rem This program just displays Hello World set message=Hello World echo %message%
输出
上述命令产生以下输出。您会注意到带有 Rem 语句的行将不会被执行。
Hello World
使用 :: 语句的注释
在批处理脚本中创建注释的另一种方法是通过 :: 命令。任何跟在 :: 语句之后的文本都将被视为注释并且不会被执行。以下是该语句的一般语法。
句法
:: Remarks
其中“备注”是需要添加的注释。
以下示例显示了使用 Rem 命令的简单方法。
例子
&commatecho 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!”。
S.No | 字符串和描述 |
---|---|
1 | Create String
可以通过以下方式在 DOS 中创建字符串。 |
2 | Empty String
空字符串 |
3 | String Interpolation
字符串插值是一种通过将常量、变量、文字和表达式的值包含在字符串文字中来构造新字符串值的方法。 |
4 | String Concatenation
您可以使用 set 运算符连接两个字符串或一个字符串和一个字符,或两个字符。下面是一个简单的例子,展示了如何使用字符串连接。 |
5 | String length
在 DOS 脚本中,没有定义用于查找字符串长度的长度函数。有可用于相同的自定义函数。以下是用于查看字符串长度的自定义函数示例。 |
6 | toInt
使用 set 变量设置为字符串的变量可以使用使用 set 变量的 /A 开关转换为整数。以下示例显示了如何实现这一点。 |
7 | Align Right
这用于将文本向右对齐,这通常用于提高数字列的可读性。 |
8 | Left String
这用于从字符串的开头提取字符。 |
9 | Mid String
这用于通过字符串中字符的位置提取子字符串。 |
10 | Remove
字符串替换功能还可用于从另一个字符串中删除子字符串。 |
11 | Remove Both Ends
这用于删除字符串的第一个和最后一个字符。 |
12 | Remove All Spaces
这用于通过替换删除字符串中的所有空格。 |
13 | Replace a String
要用另一个字符串替换子字符串,请使用字符串替换功能。 |
14 | Right String
这用于从字符串的末尾提取字符。 |
批处理脚本 – 数组
数组在批处理脚本中没有明确定义为一种类型,但可以实现。在批处理脚本中实现数组时需要注意以下几点。
- 数组的每个元素都需要用 set 命令定义。
- ‘for’ 循环需要遍历数组的值。
创建数组
使用以下 set 命令创建数组。
set a[0]=1
其中 0 是数组的索引,1 是分配给数组第一个元素的值。
实现数组的另一种方法是定义值列表并遍历值列表。以下示例显示了如何实现这一点。
例子
&commatecho off set list=1 2 3 4 (for %%a in (%list%) do ( echo %%a ))
输出
上述命令产生以下输出。
1 2 3 4
访问数组
您可以使用下标语法从数组中检索一个值,在数组名称后立即传递您想要检索的值的索引。
例子
&commatecho off set a[0]=1 echo %a[0]%
在本例中,索引从 0 开始,这意味着可以使用索引为 0 来访问第一个元素,可以使用索引为 1 来访问第二个元素,依此类推。让我们检查以下示例以创建、初始化和访问数组 –
&commatecho 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 元素以及数组元素的最后一个索引。
例子
&commatecho 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
您可以通过在给定索引处分配新值来修改 Array 的现有元素,如下例所示 –
&commatecho 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”循环并遍历数组的每个元素来实现的。以下示例显示了一种可以实现数组的简单方法。
&commatecho 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
数组的长度
数组的长度是通过迭代数组中的值列表来完成的,因为没有直接的函数来确定数组中元素的数量。
&commatecho 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&plus=1" GOTO :SymLoop ) echo "The length of the array is" %x%
输出
输出 上述命令产生以下输出。
1 2 3 4 "The length of the array is" 4
在数组中创建结构
结构也可以在批处理文件中使用一些额外的代码来实现。以下示例显示了如何实现这一点。
例子
@echo off 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 FOR /L %%i IN (0 1 2) DO ( call echo Name = %%obj[%%i].Name%% call echo Value = %%obj[%%i].ID%% )
上面的代码需要注意以下几个关键点。
-
使用 set 命令定义的每个变量都有 2 个与数组的每个索引相关联的值。
-
变量i设置为 0,以便我们可以遍历结构体,将数组的长度设为 3。
-
我们总是检查 i 的值是否等于len的值的条件,如果不是,我们循环遍历代码。
-
我们可以使用 obj[%i%] 符号访问结构的每个元素。
输出
上述命令产生以下输出。
Name=Joe Value=1 Name=Mark Value=2 Name=Mohan Value=3
批处理脚本 – 决策
决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及在确定条件为真时要执行的一个或多个语句,以及可选地,如果条件为真则要执行的其他语句条件确定为假。
S.No | 字符串和描述 |
---|---|
1 | If Statement
第一个决策语句是“if”语句。 |
2 | If/else Statement
下一个决策语句是 If/else 语句。以下是该声明的一般形式。 |
3 | Nested If Statements
有时,需要将多个“if”语句相互嵌入。以下是该声明的一般形式。 |
批处理脚本 – 运算符
运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。
在批处理脚本中,可以使用以下类型的运算符。
- 算术运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 按位运算符
算术运算符
批处理脚本语言像任何语言一样支持普通的算术运算符。以下是可用的算术运算符。
Operator | 描述 | 例子 |
---|---|---|
&plus | 两个操作数相加 | 1 加 2 给 3 |
− | 从第一个操作数中减去第二个操作数 | 2 − 1 将给出 1 |
* | 两个操作数的乘法 | 2 * 2 将给 4 |
/ | 分子除以分母 | 3 / 2 会给 1.5 |
% | 整数/浮点除法后的模运算符和余数 | 3 % 2 将给 1 |
关系运算符
关系运算符允许比较对象。以下是可用的关系运算符。
Operator | 描述 | 例子 |
---|---|---|
EQU | 测试两个对象之间的相等性 | 2 EQU 2 将给出真 |
NEQ | 测试两个对象之间的差异 | 3 NEQ 2 将给出真 |
LSS | 检查左对象是否小于右操作数 | 2 LSS 3 将给出真 |
LEQ | 检查左对象是否小于或等于右操作数 | 2 LEQ 3 将给出真 |
GTR | 检查左对象是否大于右操作数 | 3 GTR 2 将给出真 |
GEQ | 检查左对象是否大于或等于右操作数 | 3 GEQ 2 将给出真 |
逻辑运算符
逻辑运算符用于计算布尔表达式。以下是可用的逻辑运算符。
批处理语言配备了一整套布尔逻辑运算符,如 AND、OR、XOR,但仅适用于二进制数。TRUE 或 FALSE 也没有任何值。唯一可用于条件的逻辑运算符是 NOT 运算符。
Operator | 描述 |
---|---|
AND | 这是逻辑“与”运算符 |
OR | 这是逻辑“或”运算符 |
NOT | 这是逻辑“非”运算符 |
赋值运算符
批处理脚本语言还提供赋值运算符。以下是可用的赋值运算符。
Operator | 描述 | 例子 |
---|---|---|
&plus= | 这将右操作数添加到左操作数并将结果分配给左操作数 |
设置/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 |
按位运算符
批处理脚本中也可以使用位运算符。以下是可用的运算符。
Operator | 描述 |
---|---|
& | 这是按位“与”运算符 |
| | 这是按位“或”运算符 |
^ | 这是按位“xor”或 Exclusive 或运算符 |
以下是展示这些运算符的真值表。
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 Scripting 中的日期和时间有以下两个基本命令,用于检索系统的日期和时间。
日期
此命令获取系统日期。
句法
DATE
例子
&commatecho off echo %DATE%
输出
当前日期将显示在命令提示符中。例如,
Mon 12/28/2015
时间
此命令设置或显示时间。
句法
TIME
例子
&commatecho off echo %TIME%
输出
将显示当前系统时间。例如,
22:06:52.87
以下是一些可用于获取不同格式的日期和时间的实现。
格式为年-月-日的日期
例子
&commatecho 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重定向到文件 list.txt。
Dir C:\ 2> list.txt
甚至可以使用文件号和“&”前缀来组合stdout和stderr流。下面是一个例子。
DIR C:\ > lists.txt 2>&1
抑制程序输出
伪文件 NUL 用于丢弃程序的任何输出。以下示例显示通过将输出发送到 NUL 来丢弃命令 DIR 的输出。
Dir C:\ > NUL
标准输入
要使用标准输入,您必须使用一种解决方法来实现这一点。这可以通过重定向命令提示符自己的标准输入来完成,称为 CON。
以下示例显示了如何将输出重定向到名为lists.txt 的文件。执行以下命令后,命令提示符将接受用户输入的所有输入,直到获得 EOF 字符。稍后,它将所有输入发送到文件lists.txt。
TYPE CON > lists.txt
批处理脚本 – 返回代码
默认情况下,当命令行执行完成时,它应该要么在执行成功时返回零,要么在执行失败时返回非零。当批处理脚本在执行失败后返回非零值时,非零值将指示错误号是多少。然后我们将使用错误编号来确定错误的内容并相应地解决它。
以下是常见的退出代码及其说明。
Error Code | 描述 |
---|---|
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的文件,那么我们应该将errorlevel设置为7。同样,如果我们看到变量userprofile没有定义,那么我们应该将errorlevel代码设置为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 不存在,则控制台输出中将不显示任何内容。
-
如果上述两个条件都通过,则命令提示符中将显示字符串“成功完成”。
循环
在决策制定一章中,我们已经看到以顺序方式一个接一个执行的语句。此外,还可以在批处理脚本中完成实现,以更改程序逻辑中的控制流。然后将它们分类为控制语句流。
S.No | 循环和描述 |
---|---|
1 | While Statement Implementation
批处理脚本中没有可用的直接 while 语句,但我们可以通过使用 if 语句和标签非常轻松地实现此循环。 |
2 | For Statement – List Implementations
“FOR”构造为批处理文件提供循环功能。以下是用于处理值列表的“for”语句的常见构造。 |
3 | Looping through Ranges
‘for’ 语句还可以在一系列值之间移动。以下是声明的一般形式。 |
4 | Classic for Loop Implementation
以下是大多数编程语言中都可用的经典“for”语句。 |
循环遍历命令行参数
‘for’ 语句也可用于检查命令行参数。以下示例显示如何使用 ‘for’ 语句循环遍历命令行参数。
例子
&commatECHO 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
S.No | 循环和描述 |
---|---|
1 | Break Statement Implementation
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
S.No | 功能和说明 |
---|---|
1 | Calling a Function
使用 call 命令在批处理脚本中调用函数。 |
2 | Functions with Parameters
函数可以通过在调用函数时简单地传递参数来处理参数。 |
3 | Functions with Return Values
函数可以通过简单地传递变量名称来处理返回值 |
4 | Local Variables in Functions
函数中的局部变量可用于避免名称冲突并保持函数局部的变量更改。 |
5 | Recursive Functions
通过将变量更改保持在函数本地并且对调用者不可见,从而完全封装函数体的能力。 |
6 | File I/O
在批处理脚本中,可以执行在任何编程语言中预期的正常文件 I/O 操作。 |
7 | Creating Files
新文件的创建是在重定向过滤器 > 的帮助下完成的。此过滤器可用于将任何输出重定向到文件。 |
8 | Writing to Files
内容写入文件也是在重定向过滤器 > 的帮助下完成的。此过滤器可用于将任何输出重定向到文件。 |
9 | Appending to Files
内容写入文件也是在双重定向过滤器 >> 的帮助下完成的。此过滤器可用于将任何输出附加到文件中。 |
10 | Reading from Files
批处理脚本中文件的读取是通过使用 FOR 循环命令遍历需要读取的文件中定义的每一行来完成的。 |
11 | Deleting Files
对于删除文件,批处理脚本提供了 DEL 命令。 |
12 | Renaming Files
对于重命名文件,批处理脚本提供了 REN 或 RENAME 命令。 |
13 | Moving Files
对于移动文件,批处理脚本提供了 MOVE 命令。 |
14 | Batch Files – Pipes
管道运算符 (|) 获取一个命令的输出(默认为 STDOUT)并将其定向到另一个命令的输入(默认为 STDIN)。 |
15 | Batch Files – Inputs
运行批处理文件时,您可以选择传入命令行参数,然后可以在程序中读取这些参数以进行进一步处理。 |
16 | Using the SHIFT Operator
命令行参数的限制之一是它只能接受直到 %9 的参数。让我们举一个这个限制的例子。 |
17 | Folders
在批处理脚本中,可以执行任何编程语言中预期的基于文件夹的正常操作。 |
18 | Creating Folders
文件夹的创建是在 MD(制作目录)命令的帮助下完成的。 |
19 | Listing Folder Contents
可以使用 dir 命令完成文件夹内容的列表。此命令允许您查看当前目录中的可用文件和目录。 |
20 | Deleting Folders
对于删除文件夹,批处理脚本提供了 DEL 命令。 |
21 | Renaming Folders
对于重命名文件夹,批处理脚本提供了 REN 或 RENAME 命令。 |
22 | Moving Folders
对于移动文件夹,批处理脚本提供了 MOVE 命令。 |
批处理脚本 – 处理
在本章中,我们将讨论批处理脚本中涉及的各种过程。
查看正在运行的进程列表
在批处理脚本中,TASKLIST 命令可用于获取系统中当前正在运行的进程列表。
句法
TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
S.No. | 选项和说明 |
---|---|
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 命令行终止任务。用于此目的的命令是 TASKILL 命令。
句法
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
S.No. | 选项和说明 |
---|---|
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
上面的命令会杀死一个进程为 9214 的进程。
开始一个新的过程
DOS 脚本也可以完全启动一个新进程。这是通过使用 START 命令实现的。
句法
START "title" [/D path] [options] "command" [parameters]
其中
-
title – CMD 窗口标题栏的文本(必需。)
-
路径– 起始目录。
-
command – 要运行的命令、批处理文件或可执行程序。
-
参数– 传递给命令的参数。
S.No. | 选项和说明 |
---|---|
1. |
/MIN 启动窗口最小化 |
2. |
/MAX 启动窗口最大化。 |
3. |
/LOW 使用 IDLE 优先级。 |
4. |
/NORMAL 使用 NORMAL 优先级。 |
5. |
/ABOVENORMAL 使用 ABOVENORMAL 优先级。 |
6. |
/BELOWNORMAL 使用 BELOWNORMAL 优先级。 |
7. |
/HIGH 使用高优先级。 |
8. |
/REALTIME 使用实时优先级。 |
例子
START "Test Batch Script" /Min test.bat
上述命令将在新窗口中运行批处理脚本 test.bat。窗口将以最小化模式启动,并且标题为“Test Batch Script”。
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 命令的选项的描述。
S.No. | 选项和说明 |
---|---|
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 命令。
&commatecho off doskey cd = cd/test doskey d = dir
执行命令后,您将能够在命令提示符下运行这些别名。
输出
下面的截图显示,上面创建的批处理文件执行后,你可以随意输入’d’命令,它会给你目录列表,这意味着你的别名已经创建。
删除别名
可以通过将宏的值设置为 NULL 来删除别名或宏。
例子
&commatecho off doskey cd = cd/test doskey d = dir d=
在上面的例子中,我们首先将宏 d 设置为 d = dir。之后我们将其设置为 NULL。因为我们已经将 d 的值设置为 NULL,所以宏 d 将被删除。
替换别名
可以通过将宏的值设置为新的所需值来替换别名或宏。
例子
&commatecho 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 时,会包含 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 – 有条件的重启。仅当需要重新引导才能使更改生效时,才在完成操作后重新引导系统。
-
命令– 指定 DevCon 命令。
-
要列出和显示有关计算机上设备的信息,请使用以下命令 –
-
开发者大会 HwID
-
开发者大会类
-
开发者大会列表类
-
DevCon 驱动程序文件
-
DevCon 驱动节点
-
开发者大会资源
-
开发者大会栈
-
开发者大会状态
-
DevCon Dp_enum
-
-
要在计算机上搜索有关设备的信息,请使用以下命令 –
-
开发者大会查找
-
开发者大会 FindAll
-
-
要操作设备或更改其配置,请使用以下命令 –
-
开发者大会启用
-
开发者大会禁用
-
开发者大会更新
-
开发者大会更新NI
-
开发者大会安装
-
DevCon 移除
-
开发者大会重新扫描
-
开发者大会重启
-
开发者大会重启
-
DevCon SetHwID
-
DevCon 类过滤器
-
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 路径名的语法引用键,使用反斜杠来指示层次结构的级别。
本章着眼于各种功能,例如从注册表中查询值、添加、删除和编辑值。
S.No | 注册类型和描述 |
---|---|
1 | Reading from the Registry
从注册表中读取是通过 REG QUERY 命令完成的。 |
2 | Adding to the Registry
添加到注册表是通过 REG ADD 命令完成的。 |
3 | Deleting from the Registry
从注册表中删除是通过 REG DEL 命令完成的。 |
4 | Copying Registry Keys
从注册表复制是通过 REG COPY 命令完成的。 |
5 | Comparing Registry Keys
比较注册表项是通过 REG COMPARE 命令完成的。 |
批处理脚本 – 网络
批处理脚本具有处理网络设置的功能。NET 命令用于更新、修复或查看网络或网络设置。本章着眼于可用于 net 命令的不同选项。
S.No | 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 ] [ &commatcommandfile ]
一些可用的选项如下 –
-
/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 的帮助下评估打印机是否存在,该 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 来检查打印机是否实际存在
批处理脚本 – 调试
通常情况下,您在运行批处理文件时会遇到问题,而且大多数情况下,您需要以某种方式调试批处理文件,以确定批处理文件本身的问题。以下是一些有助于调试批处理脚本文件的技术。
错误信息
要发现消息的来源,请按照以下步骤操作 –
步骤 1 – REM 出 &commatECHO OFF 线,即 REM &commatECHO OFF 或 :: &commatECHO OFF。
步骤 2 – 使用所需的命令行参数运行批处理文件,将所有输出重定向到日志文件以供以后比较。
test.bat > batch.log 2>&1
步骤 3 – 在文件 batch.log 中搜索错误消息
Step 4 – 检查上一行是否有任何意外或无效的命令、命令行开关或值;请特别注意命令中使用的任何环境变量的值。
步骤 5 – 纠正错误并重复此过程,直到所有错误消息都消失。
复杂的命令行
另一个常见的错误来源是错误重定向的命令,例如带有错误搜索字符串的“嵌套”FIND 或 FINDSTR 命令,有时在 FOR /F 循环中。
要检查这些复杂命令的有效性,请按照以下步骤操作 –
步骤 1 – 在使用复杂命令集的行之前插入“命令检查行”。
以下是一个示例,其中插入 ECHO 命令以标记第一个 TYPE 命令的输出结束和下一个开始的位置。
TYPE %Temp%.\apipaorg.reg ECHO.================================================ TYPE %Temp%.\apipaorg.reg | FIND "[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\"
步骤 2 – 按照上述步骤查找错误消息来源。
第 3 步– 特别注意“简化”命令行的输出:是预期格式的输出吗?“令牌”值或位置是否符合预期?
子程序
生成错误消息的子例程在查找错误原因时带来了额外的“挑战”,因为它们可能在同一个批处理文件中被多次调用。
为了帮助找出导致错误调用子程序的原因,请按照以下步骤操作 –
步骤 1 – 在脚本开头添加并重置计数器变量 –
SET Counter = 0
步骤 2 – 每次调用子程序时递增计数器,方法是在子程序的开头插入以下行
SET /A Counter&plus=1
步骤 3 – 在计数器增量之后插入另一行,仅包含 SET 命令;这将列出所有环境变量及其值。
步骤 4 – 按照程序查找上述错误消息来源。
Windows 版本
如果您打算将您的批处理文件分发到其他可能运行或不运行相同 Windows 版本的计算机,您将需要在尽可能多的 Windows 版本中测试您的批处理文件。
以下示例显示如何检查各种操作系统版本以检查相关的 Windows 版本。
&commatECHO OFF :: Check for Windows NT 4 and later IF NOT "%OS%"=="Windows_NT" GOTO DontRun :: Check for Windows NT 4 VER | FIND "Windows NT" >NUL && GOTO DontRun :: Check for Windows 2000 VER | FIND "Windows 2000" >NUL && GOTO DontRun :: Place actual code here . . . :: End of actual code . . . EXIT :DontRun ECHO Sorry, this batch file was written for Windows XP and later versions only
批处理脚本 – 记录
可以使用重定向命令在批处理脚本中登录。
句法
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