有关windows中批处理的应用

发布时间:2020-11-06编辑:脚本学堂
有关windows中批处理的应用,东西很多,有需要的朋友参考下吧。

发现无法使用网络映射驱动器作为备份文件存放路径
而本机磁盘空间实在是不够
于是决定在本机只备份最新2天数据
再写个批处理,做成系统调度
每周将备份数据复制到网络驱动器上存档

从网上搜到批处理产生日期文件的办法
下面是实现的比较好的

批处理文件:
 

复制代码 代码如下:
@echo off
set aFile=bak-%DATE:~4,4%%DATE:~9,2%%DATE:~12,2%
set bFile=bak-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set cFile=bak-%DATE%
echo Afile=%aFile%
echo Bfile=%bFile%
echo Cfile=%cFile%

输出:
Afile=bak-20061219
Bfile=bak-113202
Cfile=bak-星期二 2006-12-19

于是备份bat就好写了
 

复制代码 代码如下:

@echo off
echo 正在备份数据到网络驱动器。。。
set folder=%DATE%
md "y:%folder%"
copy d:DataBak*.BAK "y:%folder%"
echo 备份完毕。

@echo off
set AFile=bak-%DATE:~4,4%%DATE:~9,2%%DATE:~12,2%
set BFile=bak-%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
echo AFile=%AFile%.rar
echo BFile=%BFile%.rar

运行此批处理的结果:
AFile=bak-20060109.rar ------- 年月日 -- 8位
BFile=bak-140650.rar ---------- 时分秒 -- 6位

另:如果小时数只有一位数字,造成中间有空格而出错的问题,请使用如下方法补0
set hh=%time:~0,2%
if /i %hh% LSS 10 (set hh=0%time:~1,1%

&&我们在批处理中经常要遇到数字(值)的处理,下面我就简单讲一下批处理中数字(值)处理方法:
一、随机数
  在系统变量中有一个随机取值的变量%random%,其为0-32767之间的十进制数字,利用这个变量我们就能取得我们想要的任一组随机数字(等下会说明方法)。
二、四则运算
  如我们要对一个变量(数值)进行运算,则可使用set /a命令,如:set /a str+=1就是把变量str的数值加上1,同样只要把这个命令中的+改成-、*、/就可以完成对该数值的减1、乘1、除1运算了,而更重要的是我们可以通过set /a命令来进行四则运算,如:set /a str=5*6+4*3-2*7,也可以进行变量和变量间的四则运算,如:set /a str=%a%/%b%*%c%-%d%,但要注意一点:运算仅限于整数,如要对小数进行运算可先乘上10的n次方。
三、取余
  所谓余数就是除数除以被除数剩下的值,在批处理中取余运算符是用%%来表示的,如:%random%%%56就是把不断地把随机数除以56取余数,得到的数值一定是处在0-55间的,那么我们只要set /a a=%random%%%56就能把变量a的值设定在0-55间(大家想一下为什么a不会等于56),如要把a设定在1-56间,则只需set /a a=%random%%%56+1,我们了解了这点是很重要的,如要随机设定一台机器的ip(假设4个数值都随机取定)则只需写下以下代码(设置部分略去):
 

复制代码 代码如下:
@echo off
set /a a=%random%%%256,b=%random%%%256,c=%random%%%256,d=%random%%%256
set ip=%a%.%b%.%c%.%d%
netsh interface...

四、去零
  数值去零一般是运用在时间计算上,因时间显示一般都是两位不足两位的自动在个位前补零,如07:04:01,这就给我们在运算中带来麻烦,所以对时间进行运算应该先去零,方法其实也很简单,就是利用取余运算,如要对08去零则只在08前面加上10变成108再不断地除以10余数肯定是8,如时间变量a(值为08)的运算公式为:set /a a=10%a%%%10,但时间是有两位数的,因此要将上面的公式变为set /a a=100%a%%%100,现在我们对上面的07:04:01进行取零:
 

复制代码 代码如下:
@echo off
set str=07:04:01
for /f "delims=: tokens=1-3" %%a in ("%str%") do (
set /a a=100%%a%%100,b=100%%b%%100,c=100%%c%%100
)
echo %a%:%b%:%c%&pause>nul

最后显示的结果就是7:4:1。
五、递加(减、乘、除)运算
  在批处理中我们经常要用到递加(减、乘、除)的运算,那怎么实现呢?只有通过循环来实现,有两种循环的方法:一种是for循环,一种是goto循环。如我们要对一个数值5进行递加100次变成105,两种方法的代码如下:
1.for循环
 

复制代码 代码如下:
@echo off
set n=5
for /l %%i in (1,1,100) do set /a n+=1
echo %n%&pause>nul

2.goto循环
 

复制代码 代码如下:
@echo off
set n=5
:begin
set /a n+=1
if %n% neq 105 goto begin
echo %n%&pause>nul

同理可实现递减、乘、除和重复四则运算。
  我也就简单讲这么多了,主要是想给初学批处理的新手以自己微薄的帮助,还望各位高人予以补充和指教。

批处理 if条件语句 数值或者字符串的比较
《批处理入门手册》

三.高级语句篇

3.1 学习if条件语句
学习要点:

5种if语句的基本语法:

1。判断两个字符串是否相等,if "字符串1"=="字符串2" command 语句;

2。判断两个数值是否相等,if 数值1 equ 数值2 command 语句;

3。判断判断驱动器,文件或文件夹是否存在,if exist filename command 语句;

4。判断变量是否已经定义,if defined 变量 command 语句;

5。判断上个命令的返回值,if errorlevel 数值 command 语句。

补充1:if not 语句。
1。判断两个字符串是否相等,if"字符串1"=="字符串2" command 语句
注意:在"字符串1"=="字符串2"中,是两个连续的"="

例1,
 

复制代码 代码如下:
@echo off
set /p var1=请输入第一个比较的字符:
set /p var2=请输入第二个比软的字符:
if "%var1%"=="%var2%" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause
 

执行后会要求你输入两个字符串,然后批处理判断它俩是否相同。
在判断字符串是否相等的时候,if是会区分大小写的,请看,

例2,
 

复制代码 代码如下:
@echo off
if "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause
 

执行后会显示:输入的两个字符不相同
如果我们不想让它区分大小写,则可以加上/i 参数。再看下面这个例子,

例3,
 

复制代码 代码如下:
@echo off
if /i "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause
 

这次执行后会显示:输入的两个字符相同

2。判断两个数值是否相等,if 数值1 equ 数值2 command 语句
语句中的equ 表示相等的意思,判断两个数值之间的大小关系还有以下关系符号:
中文含义   关系符   英文解释
等于equ  equal
大于gtr  greater than
大于或等于  geq  greater than or equal
小于lss   less than
小于或等于  leq  less than or equal
不等于  neq  no equal

我们还是来看个例子,
例4,
 

复制代码 代码如下:
@echo off
set /p var=请输入一个数字:
if %var% geq 10 (echo 此数大于或等于10) else echo 此数小于10
pause
 

注意哦,批处理中的大于号,小于号,等于号等等都不能用:“>”  “<”  “=” 这些符号,而要用像"gtr"这类的。

☆注意:if 比较字符串与比较数字 之间的区别

它们的区别体现在引号""上面,请看下面的例子
【example 1】
 

复制代码 代码如下:
@echo off
if "12" lss "4" (echo 12竟然小于4哦?) else echo 12当然不会小于4的!
pause

执行的结果是:12竟然小于4哦?
【example 2】
 

复制代码 代码如下:
@echo off
if 12 lss 4 (echo 12竟然小于4哦?) else echo 12当然不会小于4的!
Pause
 

执行的结果是:12当然不会小于4的!

为什么【example 1】中加了双引号""会出错呢?

原因如下:

如果要比较的两个元素加了双引号"",那么会被当成是字符的比较。两个元素作比较的流程是:先比较两个元素的首位,如果首位相同,再比较第二位,如果第二位相同,再比较第三位。。。依此,在【example 1】if "12" lss "4" 语句中,实质是1与4的比较,1当然小于4,所以执行了后面的命令:echo 12竟然小于4哦?
☆建议:如果是字符串的比较就使用双引号"" 是数字的比较就不用双引号了!

3。判断判断驱动器,文件或文件夹是否存在,if exist filename command 语句
我们来瞧瞧这个判断驱动器,文件或者文件夹是否存在的语句,这里if exist filename 是表示:存在 filename的意思。

例5,
 

复制代码 代码如下:
@echo off
if exist "e:" (echo e盘存在) else echo e盘不存在
pause>nul
 

这里是判断e: 是否存在!

例6,
 

复制代码 代码如下:
@echo off
if exist d:123.bat (echo 123.bat文件存在!) else echo 123.bat文件不存在!
pause

这个例子是用来判断123.bat文件是否存在的,但并不严谨!如果123.bat是一个文件夹而不是一个文件时,上面的判断就不行了!那么如何判断指定的文件123.txt是否存在?请看:
 

复制代码 代码如下:
@echo off
dir /a-d d:123.bat >nul 2>nul
if %errorlevel%==0 (echo 123.bat文件存在!) else echo 123.bat文件不存在!
Pause

先用dir的/a-d参数去除123.bat的目录属性,指定说明要搜索的123.bat是文件而不是文件夹,并把结果(包括正确和错误)屏蔽(>nul 2>nul),如果dir找到了文件123.bat,那么其errorlevel值(dir命令的退出编码)会被设为0,否则为1则是没有此文件。当然也可以用||和&&来判断。关于为什么要用if %errorlevel%==0 而不用if errorlevel 0呢?在后面if errorlevel中会有说明!