批处理简明教程及示例

批处理是Windows自带的一个脚本引擎,语法简洁、内置一些功能强大的命令,并且可以与Windows上的其他软件进行良好的通信。批处理能够提供一系统自动化处理功能,大幅提高日常工作中的一些琐碎重复事情的效率。

1. 概念

  • 批处理(Batch),顾名思义即是指批量处理。批处理是基于dos命令行,Windows默认内置解释器cmd.exe的脚本语言。批处理文件默认保存为.bat或.cmd。
  • 批处理是基于Dos命令行,所以批处理是没有GUI的,是运行在命令提示符终端(Command Prompt Terminal)上的, Command Prompt Terminal也被称为Dos Console。
  • 批处理文件默认的存储格式为ANSI,即使用Windows系统默认的编码格式。
    在这里插入图片描述

2. 解释器

  • 批处理大小写不敏感。
  • 批处理解释器默认是读取一行代码,然后解释执行。
  • 批处理解释器如果读取到圆括号“(”,则认为直到下一个对应的“)”为结束。此方式可以让批处理解释器一次解释执行多条命令。
  • CTRL+C退出当前正在执行的批处理。在这里插入图片描述

3. 语法

3.1. 注释

  • 段注释,主要是利用goto来达到段注释的效果,如:
goto start     
= 可以是多行文本,可以是命令    
= 可以包含重定向符号和其他特殊字符     
= 只要不包含 :start 这一行,就都是注释    
:start
  • 行注释,推荐前面两种方式:
    在这里插入图片描述

3.2. 基础指令

  • Echo命令,用来输出后面的信息,后面的信息是字符串也可以是变量。

  • 回显,显示正在执行的代码内容。

    • 批处理代码默认是开启回显的。
    • Echo off是关闭此后代码的回显,echo on是开启此后代码的回显。
    • @是关闭此行代码的回显。如:@echo “Hello, World!”
    • @echo off是关闭此行代码及此后的回显,@echo on是开启此行及此后代码的回显。
  • Pause,暂停指定,暂停批处理解释器继续读解释执行代码。用户按任何键将继续。

  • Cls,清屏命令,清除当前控制台显示的内容。

3.3. 定义变量

  • 字符串变量

set variable-name=value

set info=Hello world.
echo %info%

注意:=左右都是字符,如果有空格,空格也属性字符串的一部分。
使用set设置的环境变量只在当前进程及其继承进程有效,并且是临时的,进程关闭重启之后失效。

  • 数字变量

set /A variable-name=value

set /A age=18
echo %age%

注意: 可进行加、减、乘、除、取余操作。 它们的符号分别是 + - * / % ,set /a 可计算的数值,
单个数值且最终运算结果只能大于或等于-2的31次方,小于2的31次方“。批处理算术只能针对整数。

3.4. 字符串

	set toolName=MPTool
	set ver=1.0.1
	set /A verNo=5
	rem 取消字符串变量
	set ver=
	rem 判断字符串变量是否取消
	if [%ver%]==[] echo "String ver is empty" 
	rem 字符串连接
	set mpVer=%toolName%  %ver%  %verNo%
	rem 字符串转整型
	set val=12345
	set /A numeric=%val%
	rem 替换字符串
	set text=Make America great again
	echo %text:America=China%
	
	rem 截取字符串
	set info=abcdefghijklmnopqrstuvwxyz0123456789
	echo 截取前5个字符:
	echo %info:~0,5%
	echo 截取最后5个字符:
	echo %info:~-5%
	echo 截取第一个到倒数第6个字符:
	echo %info:~0,-5%
	echo 从第4个字符开始,截取5个字符:
	echo %info:~3,5%
	echo 从倒数第14个字符开始,截取5个字符:
	echo %info:~-14,5%

3.5. 数组

批处理并不支持真正的数组,以下操作只是模拟数组、列表。

  • 定义数组
   set a[0]=3
   set a[1]=5
   set a[2]=7
  • 单个访问数组
	echo %a[0]% %a[1]% %a[2]% 
  • 遍历访问
	setlocal enabledelayedexpansion
	for /l %%n in (0,1,2) do ( 
	echo ![%%n]! ) 
  • 定义列表
	set list = 1 3 5 7 9
  • 遍历访问
	for %%a in (%list%) do ( 
	echo %%a ) 

3.6. 条件判断

  • 语法

    if condition (do some stuff)
    if condition (do some stuff) else (do other stuff)

  • 示例
	set name=tom
	if %name%==tom (echo yes) 
	set age=21
	if %age%==20 (echo yes) else (echo No)

REM 圆括号内的内容可以换行

  • 其他判断符号
    EQU - 等于
    NEQ - 不等于 
    LSS - 小于
    LEQ - 小于或等于 
    GTR - 大于  
    GEQ - 大于或等于
  • 是否定义
	if defined name (echo Yes) else (echo No)
  • 文件是否存在
	if exist C:\set2.txt echo "File exists" 
	if exist C:\set3.txt (echo "File exists") else (echo "File does not exist") 

3.7. 循环

For中的变量在文件本时,需要使用转义字符%,在控制台时不需要。

  • 遍历字符串
    在这里插入图片描述
  • 遍历文件及目录
    在这里插入图片描述
  • 遍历文本内容
    在这里插入图片描述
  • 循环
    在这里插入图片描述
  • 变量延迟
    for语句只执行后面的一句代码,如果想写多句代码,必须用()。批处理解释代码时,是先读出当前行的代码并解析,for及之后的代码也是一次加载并解释的。这就导致for之后的代码中的变量设置了并没有立即生效。如果想要立即生效,需要启用变量延迟。
    • setlocal enabledelayedexpansion启用延迟的环境变量扩展,直到出现匹配的endlocal 命令,无论 setlocal 命令之前的设置如何。
    • setlocal disabledelayedexpansion禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
    • 示例,求0到100之和。
      在这里插入图片描述

3.8. 输入输出

  • STDIN
    标准输入,默认为键盘输入,标号为0。在批处理中STDIN被处理成CON。
	Rem 以下语句将键盘输入输出到info.txt文件夹。
	Copy con info.txt
	REM 和上面语句等价,按CTRL+C结束输入
	Type con>info.txt
  • STDOUT
    标准输出,默认输出到命令提示符窗口,标号为1。
    在批处理中默认的输出即为STDOUT,可以省略。
	Rem 以下两句等价,将IP信息从STDOUT转到文件info.txt中。
	Ipconfig >info.txt
	Ipconfig 1>info.txt
  • STDERR
    标准错误输出,默认输出到命令提示符窗口,标号为2。
	rem 以下命令只能将net的标准输出记录在result.log文件中,出错信息则会输入到控制台
	net stop myservices >result.log
	rem 如果想把错误信息输出到文件
	net stop myservices 2>result.log
	rem 如果想把正确和错误信息都输出到文件,则需要用重定向即将2重定向到1,这样两者都输出到文件
	net stop myservices 1>>result.log 2>&1
  • nul
    很多命令执行都会输出一些信息,如pause命令。但是如果我不想显示输出的信息,可以将输入信息输出定向到nul,即相当于不用输出。
    在这里插入图片描述
  • set /p
    • 获取用户输入
      在这里插入图片描述
    • 不换行输出
      在这里插入图片描述

3.9. goto和标签

	Rem goto表示跳转到指定标签的位置 
	Goto XX 
	Rem XX标签标记位置 
	:XX
  • 用goto模拟while
	:While
	If %name% NEQ tom (
	Rem do some stuff
	Goto while
	)
  • 用goto模拟函数
	:Begin
	Set /p a=please enter:
	If %a%==2 Goto funcA
	If %a%==3 Goto FuncB
	Exit
	
	:FuncA
	Rem do some stuff
	Goto Begin:
	
	:FuncB
	Rem do some stuff
	Goto Begin:

3.10. Call子程序

  • 调用子代码
   CALL :label arguments
   :label   rem do so stuff
  • 调用批处理
 	call f:\test.bat 1 3
  • 获取参数
    call调用子程序可以带参数,参数默认以%0、%1来获取,参数可以进行扩展。
    在这里插入图片描述

3.11. 文件读写

  • 创建新文件并写入
    在这里插入图片描述
  • 追加到原文件写入
    在这里插入图片描述
  • 读文件
    在这里插入图片描述

3.12. 组合命令及管道

  • &
    Usage:第一条命令 & 第二条命令 [& 第三条命令…]
    用这种方法可以同时执行多条命令,而不管命令是否执行成功
  • &&
    Usage:第一条命令 && 第二条命令 [&& 第三条命令…]
    用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
  • ||
    Usage:第一条命令 || 第二条命令 [|| 第三条命令…]
    用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
  • |
    Usage:第一条命令 | 第二条命令 [| 第三条命令…]
    将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。
  • >,>>
    将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内
    容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。
  • < , >& , <&
    < 从文件中而不是从键盘中读入命令输入。
    >& 将一个句柄的输出写入到另一个句柄的输入中。
    <& 从一个句柄读取输入并将其写入到另一个句柄输出中。

3.13. 转义字符

批处理中有很多特殊的符号有特殊的用途,但是当我们想将这些特殊的符号当作原始的字符来用时,就需要特殊的处理,此时就需要转义字符^来标识。

  • 普通字符串
	:: 此时就需要转义,否则批处理执行错误
	Echo you ^& me
  • 命令字符串
	:: dir /ad /b /s “%~dp0”^|sort /r是命令字符串,所以|前必须加^转义为字符串
	for /f “delims=” %%a in (‘dir /ad /b /s "%~dp0"^|sort /r') do (
	  rd "%%a">nul 2>nul)

3.14. 退出及退出码

  • 批处理退出exit
    EXIT [/B] [exitCode]
    REM 退出当前cmd.exe,退出码为1.
    Exit /B 1
  • 批处理退出goto :EOF
    Goto :EOF退出到上一个调用,上一个调用可以是另外一个批处理中的call命令,也可以是当前批处理中的Call命令。
  • Windows中每一个进程退出都有退出码。
    Win32中有API,exit(exitCode)设置当前进程的退出码。
    Python中也能够通过os.exit(exitCode)来设置退出码。
    批处理中直接调用exe时,是阻塞的方式,等待exe结束之后,通过变量%errorlevel%获取。

3.15. 内置命令简介

  1. Cd设置当前目录
  2. Md创建文件夹
  3. Rd删除文件夹
  4. Ren重命名文件
  5. Copy拷贝文件
  6. Del删除文件
  7. Dir显示目录
  8. Move移动文件
  9. ASSOC指定或修改文件类型
  10. FTYPE显示修改文件关系类型
  11. Date/time显示当前日期和时间
  12. Attrib设置显示文件属性
  13. Choice选择判断
  14. Mode设置窗口
  15. Color设置窗口字体背景颜色
  16. title设置控制标题

3.16. 扩展模块简介

批处理的很多功能都通过扩展组件完成的,Windows的组件基本都提供了命令行操作。

  1. Find/findstr查找文本内容,支持正则表达式。
  2. Forfiles遍历文本内容,forfiles只支持ANSI格式的文本。
  3. Ipconfig获取IP相关的
  4. WMIC调用WMIC组件获取设备信息
  5. Devcon控制设备安装驱动等
  6. Xcopy拷贝文件扩展功能
  7. Format/diskpart格式化分区有关功能
  8. Schtasks定时计划功能
  9. Netstat配置网络IP协议等
  10. REG操作注册表
  11. Explorer打开文件夹
  12. Ping网络通信
  13. Shutdown关机命令
  14. Regsvr32注册反注册组件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章