【批处理】批处理命令/符号/语句结构/字符串/数值计算_合集百度百科_收藏

批处理——对某对象进行批量的处理,便于我们便捷处理事项的工具之一。

一、示例

以下这段代码是一个输出“hello world”的批处理代码:

@echo off
echo hello world
pause & exit


以下这段代码可以把用户输入的字符赋值到"input"变量里,并输出:

@echo off
set /p "input=>"
echo 您输入的是%input%
pause


二、命令介绍

1、echo 命令

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

语法:

echo [{on|off}] [message]

示例:

@echo off
echo hello world

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

echo test>test.txt

命令会创建一个名为"test"的文本文件,并将"test"输入到文本文件中。

在批处理文件的开头,通常有:

@echo off

原因是"@"可以将本行的命令关闭回显,搭配"echo off"就可以不显示"echo off"的回显了。

2、rem 命令

注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改。

"::" 也具有rem的功能

但"::"和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。但是当打开回显时,rem后的内容会显示出来,然而"::"后的内容仍然不会显示。

@rem的效果跟"::"一样。

语法:

Rem [注释内容]

示例:

Rem 你好。
rem vs. ::
rem 123
:: 123
pause


3、pause 命令

暂停命令。运行 Pause 命令时,将显示下面的消息:

Press any key to continue. . .(或:请按任意键继续. . .)

示例:

@echo off
:begin
copy G:*.* d:\back
echo 请插入另一张光盘...
pause
goto begin


在这个例子中,驱动器 G 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张光盘放入驱动器 G 时,pause 命令会使程序挂起,以便您更换光盘,然后按任意键继续处理。

此命令还可以和echo命令配合使用达到自定义暂停的提示文本,如:

echo 请按下任意键来退出...
pause >nul


这段代码会输出:

请按下任意键来退出...


4、call 命令

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

语法:

call [路径文件名] [标签]]

参数:

[Drive:][Path] FileName

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

除此之外,call命令还可以调用批处理的标签行,如

call :startbat

此代码会调用此批处理内名为startbat的标签行

5、start 命令

调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。

如:start calc。exe即可打开Windows的计算器。(注意。是英文半角)

常用参数:

ce944615-e461-41a7-89b0-fae52d8400f1.png


执行的应用程序是 32-位 GUI 应用程序时,CMD。EXE 不等应用程序终止就返回命令提示(注意。是英文半角)。如果在命令

脚本内执行,该新行为则不会发生。

6、goto 命令

跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。

语法:goto label (label是参数,指定所要转向的批处理程序中的行。)

示例:

:1
start
goto 1

运行以上这段命令,就会打开很多个窗口(用来整人相当不错)。这段命令的意思是,先用start命令打开窗口,再用goto 1命令转到1标签,即第一行后面的命令。注意标签名字前面要加上英文的冒号。

标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto

命令就是根据这个:来寻找下一步跳到哪里。最好有一些说明这样别人看起来才会理解你的意图啊。


7、set 命令

显示、设置或删除变量。

显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。

设置和调用变量:例如set aa=abcd(也可写作set "aa=abcd"),就是把aa定义为abcd。如果要调用这个变量,就把aa两边加上个百分号。

示例:

set aa=abcd
echo %aa%
pause

运行这段命令就会显示“abcd”。

删除变量:"set aa="此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令无实质意义。

需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。

set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。

8、assoc命令

添加文件扩展名

语法:

assoc [File extension] [Annotation]

示例:

@echo off
assoc .txp=错误


三、符号介绍

1、回显屏蔽 - "@"

表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。

@用法举例:通过运行批处理文件对比pause和@pause命令即可明了@的效果。

2、重定向1 - ">" 与 ">>"

将输出信息重定向到指定的设备或文件。系统默认输出到显示器。

如:echo aaaaa>a.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa。

echo aaaaa>>a.txt 类似于echo aaaaa>a.txt。区别在于:如果a.txt本已存在,>a.txt会擦除a.txt中的原有内容,而>>a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。

所以,">"做的事情就是“覆盖”,而">>"做的事情就是“追加”。

需要注意的是,因为数字的特殊性,在echo输出数字时,请在后面加上空格,例如:echo 9313 >a.txt,否则有可能造成输出不完整。

3、重定向2 - "<"

将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。

示例:

@echo off

echo abcdefg——这是文件a.txt中的信息>a.txt
echo 请任意输入字符,以回车结束:

set /p ifo=

CLS

echo 【 从屏幕获得的输入信息 】
echo %ifo%

set /p ifo=<a.txt
echo 【 从文件a.txt获得的输入信息 】
echo %ifo%

pause>nul

读者观察命令与输出即可体会到重定向的功能和效果。

4、管道符号 - "|"

将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。

使用格式为:command_1|command_2

示例:

@echo off
echo aaaa>a.txt
del /p a.txt
pause
=========================================
@echo off
echo aaaa>a.txt
echo y|del /p a.txt
pause

对比以上两个批处理执行结果,读者即可明白管道符的用法和效果。

需要说明的是,上面del命令添加开关/p只是为了让读者明白管道符号的使用方法,实际删除文件时不加/p开关即可实现无提示直接删除。

5、转义符 - "^" 和 "%"

将特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:"|"、"&"、">"。

比如,如果我们想输出符号“>”,直接用命令"echo >"是不行的,必须修改为"echo ^>"。其余几个特殊符号类似需要有同样的处理。

转义字符使用举例:

@echo off
echo aaaa>a.txt
echo 第一句echo执行完毕

echo aaaa^>a.txt
echo 第二句echo执行完毕

pause

比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaa>a.txt

除了"^" ,如果想要输出"%"该怎么办呢?在这里,"%"就可以当做"%"的转义符,例如:

echo 已完成100%%

这段代码就会输出:

已完成100%

6、逻辑命令

逻辑命令符包括:"&"、"&&"、"||"

"&"——它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;
"&&"——当"&&";前面的命令成功执行时,执行"&&";后面的命令,否则不执行;
"||"——当"||"前面的命令失败时,执行"||"后面的命令,否则不执行。
@echo off

echo ^|^|
reg add HKCU /v try /f||echo **失败**
reg add HKCU1 /v try /f||echo **成功**

echo ^&^&
reg delete HKCU /v try /f&&echo **成功**
reg delete HKCU /v try /f&&echo **失败**

echo ^&
reg delete HKCU /v try /f&echo **也许成功**
reg delete HKCU /v try /f&echo **也许失败**

pause

执行reg add或reg delete后,系统会给出执行结果;我们通过echo命令也给出了“执行结果”。对比系统和我们自己给出的结果,既可以验证逻辑命令的判断机理。


四、命令介绍

1、文件夹管理

2dcc2d44-ab1b-424c-9423-3257b43a85e1.png

2、文件管理

4968947b-0af8-49e1-a0fe-bf1e304593c6.png

3、网络命令

e552da91-5d78-416d-8eed-1f1310d1fc3b.png

4、系统管理

05c50ba3-82a2-4093-8074-161ad0631e93.png

五、语句结构

类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。

1、if语句(选择结构)

if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能。

1)字符串比较

if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。

其命令格式为:

IF [not] string1 compare-op string2 command1 [else command2]

其中,比较操作符compare-op有以下几类:

785c4785-2958-4471-b571-6b0d65107f48.png


选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。

字符串比较示例:

@echo off

set str1=abcd1233
set str2=ABCD1234

if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
if /i %str1% LSS %str2% (echo str1^=str2)

echo.

set /p choice=是否显示当前时间?(y/n)
if /i not %choice% EQU n echo 当前时间是:%date% %time%

pause>nul

对于最后一个if判断,当我们输入n或N时的效果是一样的,都不会显示时间。如果我们取消开关/i,则输入N时,依旧会显示时间。

另外请注意以下两个细节:

① echo str1^=str2 (对“=”转义)
② echo. (输出空行)

2)存在判断

存在判断的功能是判断文件或文件夹是否存在。

其命令格式为:

IF [NOT] EXIST filename command1 [else command2]

示例:

@echo off

if exist %0 echo 文件%0是存在的!

if not exist %~df0 (
  echo 文件夹%~df0不存在!
) else (echo 文件夹%~df0存在!)

pause>nul

这里注意几个地方:

①.存在判断既可以判断文件也可以判断文件夹;
②.%0即代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型);
③.%~df0是对%0的修正,只保留了其驱动器盘符和路径,详情请参考for /?,属高级批处理范畴;
④.注意if语句的多行书写,多行书写要求command1的左括号必须和if在同一行、else必须和command1的右括号同行、command2的左括号必须与else同行、command1和command2都可以有任意多行,即command可以是命令集。

3)定义判断

定义判断的功能是判断变量是否存在,即是否已被定义。

其命令格式为:

IF [not] DEFINED variable command1 [else command2]

存在判断举例:

@echo off

set var=111
if defined var (echo var=%var%) else echo var尚未定义!

set var=% %
if defined var (echo var=%var%) else echo var尚未定义!

pause>nul

对比可知,"set var="可以取消变量,收回变量所占据的内存空间。

4)结果判断

masm %1.asm

if errorlevel 1 pause & edit %1.asm

link %1.obj

先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)。

另外,和其他两种用法一样,这种用法也可以表示否定。用否定的形式仍表达上面三句的意思,代码变为:

masm %1.asm

if not errorlevel 1 link %1.obj

pause & edit %1.asm


2、for语句(循环结构)

for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。

1)无开关

无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

FOR %%variable IN (set) DO command

其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

无开关for语句举例:

@echo off

for %%i in (a,"b c",d) do echo %%i

pause>nul

2)开关/L

含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

FOR /L %%variable IN (start,step,end) DO command

其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。

含开关/L的for语句举例(创建5个文件夹):

@echo off

for /l %%i in (1,2,10) do md %%i

pause

上例将新建5个文件夹,文件夹名称依次为1.3.5.7.9。可以发现,%%i的结束值并非end的值10,而是不大于(小于或等于)end的一个数。

3)开关/F

含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:

FOR /F ["options"] %%variable IN (set) DO command

其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见下表《options选项详解》或者for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。

options选项详解

547665d3-9113-48b8-bbfd-d8c21e878ed4.png


含开关/F的for语句举例:

@echo off

echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a

echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c

pause

注意第二个for循环中的“echo a=%%a b=%%b c=%%c”,%%a是在for语句中显式声明的,而%%b和%%c是因为“tokens=”选项被隐式声明的。它们按照26个字母的顺序被声明。如果在for语句中把%%a换成%%i,%%b和%%c应该替换成%%j和%%k。(i的后一个字母是j,j的后一个字母是k)

@echo off

echo 本文件夹里面的文件有:
dir>c:\file.txt

for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
  if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b
)
del c:\file.txt

pause

对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F开关系统就将delims的值默认为空格。

符号字符串中的最后一个字符星号,

那么额外的变量将在最后一个符号解析之后

分配并接受行的保留文本。本例中也可以改为4,不过文件名中有空格的文件,只能显示空格以前部分

同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。

4)开关/D或/R

含开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,故而列举此例。

含开关/R的for语句举例(文件夹遍历):

@echo off
setlocal enabledelayedexpansion

FOR /R d: %%i IN (.) DO (set dd=%%iset "dd=!dd:~0,-1!"echo !dd!)

pause
exit

上例即可以罗列出D盘下的所有文件夹,其速度要比命令"tree d:"慢多了,不过其返回结果的实用性则远远超过了tree命令。

一般情况下我们不推荐通过遍历文件夹来查找文件,特别是在查找某些程序(比如QQ。exe)的位置时。推荐通过reg命令查找注册表来查找QQ的路径,以保证查找效率。

上例中也出现了几个新面孔,如setlocal、感叹号等。其中,感叹号其实就是变量百分号(%)的强化版。之所以要用!而不用%,是因为在for循环中,当一个变量被多次赋值时,%dd%所获取的仅仅是dd第一次被赋予的值;要想刷新dd的值,就必须首先通过命令"setlocal enabledelayedexpansion"来开启延迟变量开关,然后用!dd!来获取dd的值。

for语句是批处理里面功能最强大、使用最普遍却又最难掌握的一套命令,这也是批处理菜鸟和批处理高手最明显的一个分水岭,一旦掌握了这套命令,那么你就离批处理达人不远了!


六、字符串

批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集。批处理中可实现的字符串处理功能有:截取字符串内容、替换字符串特定字段、合并字符串、扩充字符串等功能。下面对这些功能一一进行讲解。

1、截取字符串

截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符。举例说明其基本功能:

@echo off

set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo 原字符串(第二行为各字符的序号):
echo %ifo%
echo 1234567890123 45678901234567890123456
echo 截取前5个字符:
echo %ifo:~0,5%
echo 截取最后5个字符:
echo %ifo:~-5%
echo 截取第一个到倒数第6个字符:
echo %ifo:~0,-5%
echo 从第4个字符开始,截取5个字符:
echo %ifo:~3,5%
echo 从倒数第14个字符开始,截取5个字符:
echo %ifo:~-14,5%

pause

当然,上面的例子只是将字符串处理的基本功能展示出来了,还看不出字符串处理具体有什么用处。下面这个例子是对时间进行处理。

@echo off

echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒

pause

2、替换字符串

替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串。举例说明其功能:

@echo off

set aa=伟大的中国!我为你自豪!
echo 替换前:%aa%
echo 替换后:%aa:中国=中华人民共和国%
echo aa = %aa%
set "aa=%aa:中国=中华人民共和国%"
echo aa = %aa%

pause

对于上面的例子有一点说明,对比两个echo aa = %aa%可以发现,如果要修改变量aa的内容的话,就需要将修改结果“%aa:中国=中华人民共和国%”赋值给变量aa。上面的字符串截取也有着同样的特点。

3、字符串合并

其实,合并字符串就是将两个字符串放在一起就可以了。举例说明:

@echo off

set aa=伟大的中国!
set bb=我为你自豪!

echo %aa%%bb%

echo aa=%aa%
echo bb=%bb%

set "aa=%aa%%bb%"
echo aa=%aa%

pause

同样,如果要改变变量aa的内容的话,就需要将合并结果“%aa%%bb%”赋值给变量aa。

扩充字符串

“扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,具体功能罗列如下:

9d334f89-699e-48d7-87c7-ee790cf946f4.png


以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件:1.该字符串代表一个文件路径;2.变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。举例说明:

@echo off
echo 正在运行的这个批处理:
echo 完全路径:%0
echo 去掉引号:%~0
echo 所在分区:%~d0
echo 所处路径:%~p0
echo 文件名:%~n0
echo 扩展名:%~x0
echo文件属性:%~a0
echo 修改时间:%~t0
echo 文件大小:%~z0
pause

其中的%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数。例子如下:

@echo off

set aa=C:\Windows\PPP\a.btx
call :deal aaa %aa% "c c" ddd eee

pause>nul
exit

:deal
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5

其中,变量aa在之前是不可以扩充的,通过call命令并将aa作为参数传递给子函数:deal,将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。

至于%x中x取a-z A-Z的形式,可以复习一下for语句,for语句里面的变量就是用%x来表示的,因而可以直接进行扩充。


七、数值计算

批处理里面的数值计算功能较弱,只能够进行整型计算,忽略浮点数的小数部分;同时数值计算的范围也受限于系统位数,对于目前较为常见的32位机来说,数值计算能处理的数值范围为0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。

数值计算需要使用set命令,具体格式为“set /a expression”。其中,expression代表计算表达式,计算表达式跟C语言里面的表达式基本上完全一致。set支持的运算符也跟C语言里面的一样,只是没有了増一减一。set支持的运算符及优先级排序如下:

运算符及优先级

dbe50304-16a2-499e-a3da-e6ad887aa228.png


批处理中取变量的值是需要用%或者!的,而在set /a 中,直接用变量名称即可取得变量的值。另外,set支持八进制(数字前缀0)、十进制(数字无前缀)和十六进制(数字前缀0x),且支持不同进制之间的计算,如set /a a=123+0123+0x123,计算及显示结果为十进制。