初尝Windows 下批处理编程
本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了。
本文包括以下内容
1、什么是批处理
2、常用批处理命令
3、简介批处理编程结构
4、一个批处理游戏代码欣赏
5、总结
什么叫批处理
批处理(Batch)通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的解释器(通常是COMMAND.COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名。在Windows下运用批出处理的主要目的是完成自动化操作(如无人值守安装程序、批量处理txt数据等或许这些操作需要调用外部程序)
Shell 在计算机科学中,是指“提供用户使用界面”的软件,通常指的是命令行界面的解析器。一般来说,这个词是指操作系统中,提供访问内核所提供之服务的程序。Shell也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。因此与之相对的是程序内核(英语:Core),内核不提供和用户的交互功能。
通常将Shell分为两类:命令行与图形界面。命令行壳层提供一个命令行界面(CLI);而图形壳层提供一个图形用户界面(GUI)
常用批处理命令
一、DOS下的常用批处理命令
屏幕显示控制:
① echo 回显控制(在命令提示符或DOS下,每执行一条命令都会显示在屏幕上,这就叫回显)
echo on :: 打开回显 echo off :: 关闭回显 @echo off :: 关闭回显,且连这句都不显示,常用 echo hello world :: echo 还有打印的功能
② cls 清屏命令
③ @ 符号
如某条命令前加@关闭该命令的回显
@cls @echo hello World
文件控制:
① edit 文本文件的创建和编辑
② del 文件的删除
格式: del [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
③ copy/move 文件的复制和移动
常用格式: copy/move 原文件路径/原文件名 新路径
move a.txt c:\xx ::将 当前目录下的a.txt 移动c:\xx目录下
指令其余格式可以查看命令帮助
④ ren 文件重命名
格式: REN [drive:][path]filename1 filename2.
例:
:: 将当前目录下的所有文件改为jpg文件 :: * 是通配符,代表任意数量的字符 ren * *.jpg
⑤ attrib 设置或更改文件属性
例:
attrib +s +a +h +r Z:\bak\tools :: 对照上面解释不言自明
文件夹控制:
① cd(chdir) 显示或改变当前目录名称
格式:cd [drive:]path
常用格式列举:
cd
cd.. 返回上级目录
cd\ 返回根目录
cd fullPath
效果:
② md(mkdir) 创建文件夹
格式 md [drive:]path
可以嵌套创建文件夹,如 md a\b\c\d
③ rd(rmdir) 删除一个文件夹
格式:rd [/s] [/q] [drive:]path
/s 的意思删除指定目录下的所有文件以及子目录
/q 安静模式,不向用户询问是否删除
比如删除上面建立的文件夹
rd /s /q z:\a
文件和文件夹共同的命令:
① dir 显式目录中文件和子目录列表,详细参数见下图
② tree 显式目录结构
常用格式:
tree > z:\C_result.txt :: 当前路径为C盘根目录
运行结果:
一些特殊符号:
① 重定向符号 > 与 >>
重定向符号就是传递和覆盖的意思,它所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台,即命令提示符)。
例: tree /f > z:\result.txt :: 把当前目录的树形目录结构打印到 result.txt 文件中
> 与 >> 的区别
> 是完全覆盖以前文件内容
>> 是在以前文件内容后面接着写
② 命令管道符 |
表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,即,就是把它之前的输出作为它之后的输入。
例:
:: 查找qq.exe进程 如找到就结束 tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
③ 组合命令 & 与 && 及 ||
& 顺序执行多条命令,前面命令执行失败了,不影响后边的命令执行
:: 查找电脑 Z盘 Y 盘 以及 C盘下目录和文件 dir z:\ & dir y:\ & dir c:\
&& 顺序执行多条命令,当碰到执行错误的命令则停止执行,如无错则一直执行下去
:: 由于我的电脑没有y盘,故批处理执行到 dir y:\ 出错后就停止 dir z:\ && dir y:\ && dir c:\
|| 顺序执行多条命令,当碰到执行错误的命令才往后执行,如遇到执行正确的命令则停止
:: 大家敲下这代码就不言自明了 dir y:\ || dir z:\ || dir c:\
④ 转义字符 ^
如 echo ^>
⑤ 变量引用符 %
定义变量(后面批处理编程结构会提到)var 后,用两个%%包围变量的方式引用此变量 %var%
⑥ 界定符 ””
当路径中有空格,需用英文状态下的双引号“ ”” ” 包围路径
如:
cd "c:\Program Files"
其余指令和符号:
命令 /? 命令帮助
pause 暂停批处理程序
type 显式文本文件的内容
ver 显式操作系统版本
rem 注释符号
:: 注释符号
xcopy 复制文件和目录
* 通配符 表示任意多个字符
? 通配符 表示一个字符
find 搜索字符串
exit 退出命令
二、Windows 下的命令
网络相关:
① ping
常用参数
-t 一直 ping
-l 指定包的字节数,最大 65500 字节
ping [-l 65500 最大字节数] IP [-t]
② ipconfig 显示当前电脑TCP/IP 配置
常用参数:
/all 显示所有信息
/flushdns 刷新DNS信息
/renew 更新 DHCP 配置
③ arp 显式或修改ARP
arp –a :: 显式 ARP表
更多命令参见 arp /?
④ netstat TCP统计
常用
netstat -nao
netstat -nao > z:\tcpstat.txt
⑤ tracert 路由追踪命令
例: tracert www.baidu.com
更多命令参见 tracert /?
⑥ pathping 路程信息查看
例: pathping www.baidu.cm
更多参数详见 pathping /?
⑦ telnet (推荐用 SecureCRT)
磁盘相关:
①chkdsk 磁盘检测和修复(弱弱的修复)
详见 chkdsk /?
② subst 将驱动器与路径关联(在第一家公司写代码需要指定统一路径时用过)
创建 subst 虚拟磁盘: 物理磁盘路径
删除 subst 虚拟磁盘: /d
系统相关:
①driverquery 显示已安装驱动(个人觉得用处不大 )
② systeminfo 获取系统配置信息(个人觉得用处不大 )
③ regsvr32 注册或卸载某个动态链接库
regsvr32 /u或/i *.dll(*.ocx)
更多参数 详见 regsvr32 /?
④ tasklist 显式进程列表
用法相见 tasklist /?
⑤ taskkill 结束指定进程
我常用的格式:
taskkill /f /im 映像名 例如 关闭所有 IE 进程 taskkill /f /im iexplore.exe 结合 tasklist 和 taskkill 使用 tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
⑥ shutdown 关闭计算机
shutdown/s 关闭计算机
shutdown/r 重启计算机
shutdown/a 放弃关闭计算机
更多参数详见shutdown/?
⑦ sc 命令系列
sc create 创建服务
例:
::创建MyService,执行文件为c:\windows\system32\zfServ.exe sc create MyService binpath=c:\windows\system32\zfServ.exe
sc delete 删除服务
:: 删除MyService sc delete MyService
sc start 启动服务
:: 启动服务 MyService sc start MyService
sc stop 停止服务
::停止服务 MyService sc delete MyService
更多参数详见 sc/?
简介批处理编程结构
批处理作为一个脚本语言也有编程语言的基本结构——变量、条件语句、循环语句、函数(批处理中与此类似的是过程)
一、变量
键入set命令 查看所有已知变量(环境变量、内置系统变量)
批处理变量命名:不区分大小写
set varA =311
变量都是弱类型的(脚本语言嘛 )
区分空格
set varA = "sss"
set varA="ss"
是两个变量
如果需要用局部变量则用
setlocal
set 语句
endlocal
引用变量用 两个 %% 包围 如 %varA%
数学运算
+ 加、-减、*乘、/除、%求模
set /a 数学表达式
如
::total 自加1
set /a total+=1
二、条件语句——if 语句
格式:
if cond (
statement_1
...
statement_n
)
[else(
statement_1
..
statement_n
)]
方括号“[]”的含义为可选
例子
if "%1"=="1" (echo is one) else ( echo is not one)
比较运算符
== 判断相等
equ 判断相等
lss 小于
leq 小于或等于
gtr 大于
geq 大于或等于
三、循环语句——for 循环
基本格式: for iterator do (statements)
①遍历一系列的值
格式 :
for /L %%var in (start, step, end) do (statements) rem var 是单字母变量 如 %%i,如果是多字母变量如 %%aa 会报错
例
@echo off for /l %%B in (0,1,15) do echo %%B
② 对文件的遍历
格式:
for %%var in (fileSets) do (statements) rem fileSets 文件的集合
例1:
rem 打印 C盘下的txt文件
@echo off for %%i in (C:\*.txt) do echo %%i
rem 打印 C盘下的txt和 sys 文件
@echo off for %%i in (C:\*.txt C:\*.sys) do echo %%i
③ 对文件夹的遍历
格式:
for /d %%var in (directorySet) do (statements) rem directorySet 目录的集合
例:
@echo off for /d %%i in (Z:\) do echo %%i :: 对 Z:\ 下目录的遍历 @echo off for /d %%i in (Z:\*) do echo %%i ::多个目录的例子 @echo off for /d %%i in (%SystemRoot%\* Z:\*) do echo %%i
④ 递归对文件遍历
格式:
for /r [path] %%var in (fileSet) do (statements)
例子
@echo off for /r C:\ %%i in (*.txt) do echo %%i
⑤ /r 与 /d 结合
::输出 %SystemRoot% 下的所有目录及子目录 @echo off for /r %SystemRoot% /d %%i in (*) do echo %%i
四、函数——在批处理编程中称过程
① 不带参数的函数
@echo off echo 调用前 pause call :sub ::调用子过程 echo 调用后 pause exit :sub echo 子过程调用中 pause goto :eof
② 带参数的函数
@echo off set a=5 set b=4 call :add %a% %b% ::调用子过程 echo 两个数的和为%sum% pause exit :add set /a sum=%1+%2 goto :eof
一个批处理游戏代码欣赏
先看效果
源码:
@echo off & setlocal enabledelayedexpansion mode con cols=22 lines=11 color b0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: set touzhu=100 :begin set count=10000 echo 你现在有10000元赌资 ping -n 3 127.0.0.1>nul cls :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :first cls set/p touzhu=请输入投注钱数 echo 按任意键开始游戏 if %touzhu% gtr %count% goto err pause>nul set/a user=%random%%%6+1 for /l %%i in (1,1,500) do ( cls echo ○ echo. echo ○ cls echo ● ● echo ○ ○ echo ○ ○ cls echo ○ ○ echo ● echo ○ ○ cls echo. echo ● echo. cls echo ○ ○ echo. echo ○ ○ cls echo ○ echo ● echo ○ cls ) goto %user% :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :start set/a computer=%random%%%6+1 if %user% equ %computer% echo 电脑的点数是%computer% & echo. & echo 打平了! & echo 你现在的赌资是!count! & pause & goto end if %user% gtr %computer% echo 电脑的点数是%computer% & echo. & echo 你赢了! & set/a count=%count%+%touzhu% & echo 你现在的赌资是!count! & pause & goto end if %user% lss %computer% echo 电脑的点数是%computer% & echo. & echo 你输了! & set/a count=%count%-%touzhu% & echo 你现在的赌资是!count! & pause & goto end goto err :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :6 echo ● ● echo ○ ○ echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :5 echo ○ ○ echo ● echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :4 echo ○ ○ echo. echo ○ ○ echo. ping -n 2 127.0.0.1>nul goto start :3 echo ○ echo ● echo ○ echo. ping -n 2 127.0.0.1>nul goto start :2 echo ○ echo. echo ○ echo. ping -n 2 127.0.0.1>nul goto start :1 echo. echo ● echo. ping -n 2 127.0.0.1>nul goto start :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :err echo 错误…… ping -n 2 127.0.0.1>nul goto first :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :end if %count% leq 0 echo 你输光了! & goto last if %count% geq 20000 echo 电脑输光了! & goto last cls echo 按任意键进行下一轮赌博 pause>nul cls goto first :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :last echo 重玩?(是/y,否/n) set/p aa= if %aa% equ y cls & goto begin if %aa% equ Y cls & goto begin exit
总结
在Windows平台下批处理还是很有用的,一些简单的任务用批处理来实现会效果不错,但是比较复杂的任务用批处理编程实现就有点力有不逮了,或许能实现但是比其他语言比起来费力得多。总之简单的任务用简单的方法实现(考虑下批处理),这也许就是批处理脚本语言最好的归宿。
本文完