• 认真地记录技术中遇到的坑!

Windows批处理脚本

其他 悠悠 12个月前 (11-08) 395次浏览 0个评论

和Linux一样,Windows也有类似Shell的批处理命令,可以在DOS界面,在文件夹地址或者 Win+R 输入 cmd 回车,即可进入 cmd.exe DOS终端,交互执行命令。

还可以把多条指令写入*.bat 或者 *.cmd 文件,它们是一系列Windows命令的集合,双击即可运行批处理程序。

会一些常用的批处理命令,对于经常使用Windows的我们来说,有的时候能够很大的提高工作效率。

1. 命令查询

在Windows中,可以打开 cmd 查看任意命令的使用详情,另外,DOS命令不区分大小写,如果命令为 command 则有下面两种方法查看:

  1. command /?
  2. help command

比如查看当前目录文件命令 dir ,可以有下面两种方式查看详情

dir /?
help dir

使用单独 help 命令可以列出所有DOS自带命令列表。

2. 命令列表

下面给出一些常用的命令列表,在使用的时候,一定要善于使用 help 或者 /? 查询命令的使用方法,说明都非常详细,而且是中文。

2.1 磁盘管理

  • cd:显示当前目录名或改变当前目录
  • chkdsk:检查磁盘并显示状态报告
  • chkntfs:在启动时显示或修改磁盘检查
  • compact:显示或改变 NTFS 分区上文件的压缩
  • convert:将 FAT 卷转换成 NTFS
  • 盘符+冒号:使用相应盘符为当前路径,如 C:

2.2 文件管理

  • md / mkdir:创建目录
  • rd / rmdir:删除一个目录
  • dir:显示目录中的文件和子目录列表
  • tree:以图形显示驱动器或路径的文件夹结构
  • path:为可执行文件显示或设置一个搜索路径
  • cacls:显示或者修改文件的访问控制表(ACL)
  • xcopy:复制文件和目录树
  • type:显示文本文件的内容
  • copy:将一份或多份文件复制到另一个位置
  • del / erase:删除一个或数个文件
  • move:移动文件并重命名文件和目录
  • ren:重命名文件
  • replace:替换文件
  • attrib:显示或更改文件属性
  • assoc:显示或修改文件扩展名关联
  • find:搜索字符串
  • comp:比较两个或两套文件的内容
  • fc:比较两个文件或两个文件集并显示它们之间的不同

2.3 网络命令

  • ping:进行网络连接测试、名称解析
  • ftp:文件传输
  • net:网络命令集及用户管理
  • telnet:远程登陆
  • ipconfig:显示、修改TCP/IP设置
  • msg:给用户发送消息
  • arp:显示、修改局域网的IP地址-物理地址映射列表

2.4 系统管理

  • at:安排在特定日期和时间运行命令和程序
  • shutdown:立即或定时关机或重启
  • tskill:结束进程
  • taskkill:结束进程(比tskill高级,但WinXPHome版中无该命令)
  • tasklist:显示进程列表(Windows XP Home Edition中没有)
  • sc:系统服务设置与控制
  • reg:注册表控制台工具
  • powercfg:控制系统上的电源设置

2.5 其他辅助命令

  • color:设置默认的控制台前景和背景颜色
  • sort:对输入进行分类
  • date:显示或设置日期
  • time:显示或设置系统时间
  • at:命令安排在特定日期和时间运行命令和程序
  • more:和管道符 | 搭配使用,显示更多文本内容
  • prompt:改变命令提示符标识
  • title:改变DOS窗口的标题提示

3 常用控制脚本行为命令

echo

打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。

echo [{on|off}] [message]
Sample:@echo off / echo hello world

在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定的文件中。

rem

注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。

Rem Message
Sample:@Rem Here is the description.

pause

暂停命令,当运行bat文件时dos窗口一闪而过,可以在bat文件脚本后面添加该命令。

运行 Pause 命令时,将显示下面的消息:Press any key to continue. . .(或:请按任意键继续. . .)

call

从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

call [[Drive:][Path] FileName ] [:label [arguments]]
参数
[Drive:}[Path] FileName

指定要调用的批处理程序的位置和名称。

start

调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。 如:start calc.exe 即可打开Windows的计算器。

常用参数:

MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数

执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。

4 语法级别命令

4.1 变量:SET

显示、设置或删除 cmd.exe 环境变量。

SET [variable=[string]]

variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。

要显示当前环境变量,键入不带参数的 SET。

如果命令扩展名被启用,SET 会如下改变:

可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配 SET 命令已使用的名称的所有变量的值。例如:

SET P

会显示所有以字母 P 打头的变量

如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL 设置成 1。

SET 命令不允许变量名含有等号。

在 SET 命令中添加了两个新命令行开关:

SET /A expression
SET /P variable=[promptString]

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。

  • 该表达式支持包括位移,逻辑,运算甚至逗号运算符。
  • 如果您使用任何逻辑或取余操作符,您需要将表达式字符串用引号扩起来。
  • 在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。
  • 如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。
  • 这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。
  • 如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。

/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。

环境变量替换已如下增强:

%PATH:str1=str2%

会扩展 PATH 环境变量,用 “str2” 代替扩展结果中的每个 “str1″。要有效地从扩展结果中删除所有的 “str1″,”str2″ 可以是空的。”str1″ 可以以星号打头;在这种情况下,”str1” 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

也可以为扩展名指定子字符串。

%PATH:~10,5%

会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。

%PATH:~-10%

会提取 PATH 变量的最后十个字符。

%PATH:~0,-2%

会提取 PATH 变量的所有字符,除了最后两个。

终于添加了延迟环境变量扩充的支持。该支持总是按默认值被停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。以下例子说明直接变量扩充的问题:

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)

不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个复合语句。所以,复合语句中的 IF 实际上是在比较 “before” 和”after”,这两者永远不会相等。同样,以下这个例子也不会达到预期效果:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

原因是,它不会在目前的目录中建立一个文件列表,而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量是空的。因此,我们真正执行的 FOR 循环是:

for %i in (*) do set LIST= %i

这个循环继续将 LIST 设成找到的最后一个文件。

延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果:

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

如果命令扩展名被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些名称中任何一个定义变量,那个定义会替代下面描述的动态定义:

  • %CD% – 扩展到当前目录字符串。
  • %DATE% – 用跟 DATE 命令同样的格式扩展到当前日期。
  • %TIME% – 用跟 TIME 命令同样的格式扩展到当前时间。
  • %RANDOM% – 扩展到 0 和 32767 之间的任意十进制数字。
  • %ERRORLEVEL% – 扩展到当前 ERRORLEVEL 数值。
  • %CMDEXTVERSION% – 扩展到当前命令处理器扩展名版本号。
  • %CMDCMDLINE% – 扩展到调用命令处理器的原始命令行。

4.2 条件判断:if,else

执行批处理程序中的条件处理,使用 () 来包含多条语句。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

NOT 指定只有条件为 false 的情况下, Windows XP 才应该执行该命令。

ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。

string1==string2 如果指定的文字字符串匹配,指定条件为 true。

EXIST filename 如果指定的文件名存在,指定条件为 true。

command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟一个执行 ELSE 关键字后的命令的 ELSE 命令。

ELSE 子句必须在 IF 之后出现在同一行上。例如:

IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)

因为 del 命令需要用一个新行终止,以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:

IF EXIST filename. del filename.
ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

IF EXIST filename. (del filename.) ELSE echo filename. missing

如果命令扩展名被启用,IF 会如下改变:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

其中,比较运算符可以是:

  • EQU – 等于
  • NEQ – 不等于
  • LSS – 小于
  • LEQ – 小于或等于
  • GTR – 大于
  • GEQ – 大于或等于

及 /I 开关;如果该开关被指定,则说明要进行的字符串比较不分大小写。/I 开关可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的;原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的内部版本号比较。第一个版本是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。
命令扩展名被停用时,CMDEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,除了它取得一个环境变量,返回的结果是 true。

如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL% 会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,您会得到其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:

goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1

您也可以使用以上的数字比较:

IF %ERRORLEVEL% LEQ 1 goto okay

如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE% 将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,您会得到其数值。

如果没有名为 CMDEXTVERSION 的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,您会得到其数值。

4.3 跳转语句:goto

将 cmd.exe 导向到批处理程序中带标签的行。

GOTO label

label 指定批处理程序中用作标签的文字字符串。

标签必须单独一行,并且以冒号打头。

如果命令扩展名被启用,GOTO 会如下改变:

GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的办法。有关能使该功能有用的 CALL 命令的扩展名描述,请键入CALL /?。

4.4 循环:for

对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:

FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 “options” 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

  • eol=c – 指一个行注释字符的结尾(就一个)
  • skip=n – 指在文件开始时忽略的行数。
  • delims=xxx – 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
  • tokens=x,y,m-n – 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n 格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
  • usebackq – 指定新语法已在下类情况中使用: 在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset 中使用双引号扩起文件名称。

某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或空格定界符号。请注意,这个 for 程序体的语句引用 %i 来取得第二个符号,引用 %j 来取得第三个符号,引用 %k 来取得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用 usebackq 选项,否则,双引号会 被理解成是用作定义某个要分析的字符串的。

%i 专门在 for 语句中得到说明,%j 和 %k 是通过 tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 ‘z’ 或 ‘Z’ 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有 52 个以上都在使用中。

您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,用单引号将括号之间的 filenameset 括起来。这样,该字符串会被当作一个文件中的一个单一输入行。

最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:

  • ~I – 删除任何引号(“),扩充 %I
  • %~fI – 将 %I 扩充到一个完全合格的路径名
  • %~dI – 仅将 %I 扩充到一个驱动器号
  • %~pI – 仅将 %I 扩充到一个路径
  • %~nI – 仅将 %I 扩充到一个文件名
  • %~xI – 仅将 %I 扩充到一个文件扩展名
  • %~sI – 扩充的路径只含有短名
  • %~aI – 将 %I 扩充到文件的文件属性
  • %~tI – 将 %I 扩充到文件的日期/时间
  • %~zI – 将 %I 扩充到文件的大小
  • %~$PATH:I – 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

可以组合修饰符来得到多重结果:

  • %~dpI – 仅将 %I 扩充到一个驱动器号和路径
  • %~nxI – 仅将 %I 扩充到一个文件名和扩展名
  • %~fsI – 仅将 %I 扩充到一个带有短名的完整路径名
  • %~dp$PATH:i – 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。
  • %~ftzaI – 将 %I 扩充到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。

4.5 退出指令:exit

退出 CMD.EXE 程序(命令翻译程序)或当前批处理脚本。

EXIT [/B] [exitCode]

/B 指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE

exitCode 指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码。

4.6 特殊标记符

  • CR(0D) 命令行结束符
  • Escape(1B) ANSI转义字符引导符
  • Space(20) 常用的参数界定符
  • Tab(09) ; = 不常用的参数界定符
  • + COPY命令文件连接符
  • * ? 文件通配符
  • “” 字符串界定符
  • | 命令管道符
  • < 以覆盖的方式输入重定向
  • > 以覆盖的方式输出重定向
  • >> 以追加的方式输出重定向
  • << 以追加的方式输入重定向
  • @ 命令行回显屏蔽符
  • / 参数开关引导符
  • : 批处理标签引导符
  • % 批处理变量引导符

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0%9%0表示批处理命令本身,其它参数字符串用%1%9顺序表示。

5 一些实用命令

copy kena.jpg/b + book.txt/a kenap.jpg  将book.txt文件拼接到kena.jpg后面,达到隐藏文件的目的


转载请注明出处 Windows批处理脚本
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址