windows下批处理文件的编写

来源:互联网 发布:js将字符串转换成日期 编辑:程序博客网 时间:2024/05/22 07:06

学习地址

在学习批处理命令的过程中搜索到网上的一个《批处理命令一日一教学》系列,讲得非常浅显易懂,特此mark

http://www.bathome.net/thread-2576-1-1.html


创建批处理文件


新建记事本文档,将其后缀.txt改为.bat,再用记事本打开编辑是一个批处理文件了。

批处理中的等号两边不要加空格

常用命令


echo 显示此命令后的字符
echo. echo; echo\ echo/ 这四个指令均是换行作用,注意上面的. ; \ / 是紧贴着echo指令的
echo off  所有后续命令都不显示命令行本身
@ 与echo off类似,放在每个命令行的前面,不显示此命令行
call 调用另一个批处理文件(如果不使用call而是直接调用的话将不能返回到当前批处理文件中执行后续命令)
rem 注释可以使用::代替
dir /? 查看dir指令的帮助信息
help dir 查看dir指令的帮助信息与上相同ydf
type d:\testbat\test.txt 将d:\testbat下的信息打印在屏幕上
cd /d d:\testbat\ 更改当前目录至d:\testbat\下,(注意其中的/d选项,可以直接更改驱动器,例如当前在c:\下,可以用此命令直接转至d:\testbat\下)
tree .\ > list.txt将当前目录的目录树重定向输出至文件list.txt
tree .\ >> list.txt  将当前目录的目录树追加输出至文件list.txt,注意与上面指令">"的区别
if if指令可以作为判断分支,具体用法可以通过if /?或者help if 命令进行详细查看
cd . > test.txt 产生0字节文件test.txt

copy文件复制详解 如果要复制的路径带有空格、&等特殊符号的时候,要使用引号把这些特殊符号括起来

goto流程跳转详解
del删除操作
ren重命名文件文件夹
md创建文件夹
rd删除文件夹
move移动文件文件夹
find字符串查找

for命令非常好用
for /L %%A in (1,1,254) do ping 192.168.0.%%A | find "Reply" >> pingall.log
说明:"/L"参数代表迭代, ”%%A”是可替换参数, “(1,1,254)" "表示从1开始,步长为1,一直到254.  find "Reply" 表示一旦发现Reply就将结果写入Pingall.log中。
关键记住变量%%A 以及do后要做的与变量%%A相关的指令即可。

refer to http://home.cnblogs.com/group/topic/32261.html

有时候windows的批处理能带来很方便的操作,批处理也有变量声明,下面一段就是说的如何使用批处理中的变量。
set 功能一览

[设置变量]
格式:set 变量名=变量值
详细:被设定的变量以%变量名%引用

[取消变量]
格式:set 变量名=
详细:取消后的变量若被引用%变量名%将为空

[展示变量]
格式:set 变量名
详细:展示以变量名开头的所有变量的值

[列出所有可用的变量]
格式:set

[计算器]
格式:set  /a 表达式
示例:set /a 1+2*3  输出 7

[设置变量为表达式计算后的值]
set a=1+2
echo %a% ==>输出1+2
------------------------------------
set /a a=1+2
echo %a% ==>输出3

[设置变量为用户输入的值]
set /p a=输入一个值 ==>输出 输入一个值
echo %a% ==>显示用户输入的值


预定义的变量

下面是些已经被底层定义好可以直接使用的变量:不会出现在 SET 显示的变量列表中
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。
%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
%0 bat的完整路径名如"C:\Windows\system32\xxx.bat"
%1 bat参数1依次类推%2参数2...
%path% - 当前的环境变量。以分号隔开的路径列表,路径可包含空格,可以以'\'结尾, 可以以双引号包围之。


扩展变量

@ 与%i相关的变量(bat参数或者for循环的%i)
假设文件为C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%0        C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%~dp0  C:\Documents and Settings\jinsun\桌面\
%cd%   C:\Documents and Settings\jinsun\桌面
%~nx0   ParseSinglePkgs.bat
%~n0     ParseSinglePkgs
%~x0     .bat

@ 与%VAR%相关的变量
%VAR:str1=str2%   会将VAR中的str1替换为str2(str2如果为空则可以达到删除的效果,str1前可以加*,变量%ABC:*B=%是C)
%VAR:~0,-2%          会提取VAR 变量的所有字符,除了最后两个
%VAR:~2%              会提取VAR 变量的除前两个的所有字符
%VAR:~-2%             会提取VAR 变量的最后两个
%VAR:~2,5%           提取从第2个字符开始的5个字符

这篇文章看完了就懂了“%date:~0,4%%date:~5,2%%date:~8,2%.sql”是什么意思了。

sample:

要利用计划任务和mysqldump实现自动备份mysql,


于是写了下面这个bat文件,
@echo off
F:\wwwroot\APMServ5.2.6\MySQL5.1\bin\mysqldump.exe -u root -p 111111 hsjk120>F:\wwwroot\APMServ5.2.6\MySQL5.1\bin\%date:~0,4%%date:~5,2%%date:~8,2%.sql
但是执行的时候总是提示Enter password: 这样就失去自动备份的意义了。
后来发现-p 参数比较特殊,正确语法是 -ppassword,即-p和密码中间不能有空格,于是就修改成
@echo off
F:\wwwroot\APMServ5.2.6\MySQL5.1\bin\mysqldump.exe -u root -p111111 hsjk120>F:\wwwroot\APMServ5.2.6\MySQL5.1\bin\%date:~0,4%%date:~5,2%%date:~8,2%.sql
这样就直接备份不再提醒输入密码了。

下面这段是批处理,生成以当天日期为文件名的sql文件
%date:~0,4%%date:~5,2%%date:~8,2%.sql

实测后发现: %date:~6,4%%date:~0,2%%date:~3,2%.sql 能够输出正确的以当天为文件名的sql文件,这个可能与时间格式有关,

02/24/2014 Mon 这是调用命令echo %date%显示的结果。

set testPSNRPath=C:\Users\t_dingfeny\Desktop
cd %testPSNRPath%default
set testPSNRPath=C:\Users\t_dingfeny\Desktop\
cd %testPSNRPath%default
结果一致
set testPSNRPath=C:\Users\t_dingfeny\Desktop
cd %testPSNRPath%\default
错误,可见,不能简单的看做字符串的组合

setlocal enabledelayedexpansion的用法
@echo off setlocal enabledelayedexpansionset k=3set k=4echo !k!pause
使用setlocal enabledelayedexpansion之后,变量被延迟赋值,相当于动态赋值,显示的是最新的赋值结果也就是4,而不加的话不会延迟赋值,也就是静态赋值,相当于只赋值最早的一个值。


原创粉丝点击