批处理基本运用

7854阅读 0评论2012-03-07 技术宅
分类:WINDOWS

批处理获取当前时间

%date:~4,4%     取年
%date:~9,2%     取月
%date:~12,2%   取日
%time:~0,2%     小时
%time:~3,2%     分钟
%time:~6,2%     秒
如:
rem   取系统日期及时间,同时将时间转换为8位(8:16:00-->08:16:00).
set   CurDate=%date:~0,10%
set   CurTime=%time%
set   hh=%CurTime:~0,2%
if   /i   %hh%   LSS   10   ( set   hh=0%CurTime:~1,1% )
set   mm=%CurTime:~3,2%
set   ss=%CurTime:~6,2%
set   CurDateTime=%CurDate%_%hh%:%mm%:%ss%
set   CurDateTime

语法:
%变量:~指定偏移量,指定截取字符长度%

     如果两者的数值(偏移量或长度)是负数,使用的数字将会是环境变数的长度加上位移或指定长度。我会修正上面帖子中的描述。这里举个例子来说明:

set /p ok=Input value of "ok" environment-variable:_

C:\Documents and Settings\gnaw0725>set /p ok=Input value of "ok" environment-var
iable:_
Input value of "ok" environment-variable:_1234567890

C:\Documents and Settings\gnaw0725>echo %ok%
1234567890

C:\Documents and Settings\gnaw0725>echo %ok:~4,4%
5678

C:\Documents and Settings\gnaw0725>echo %ok:~-4,4%
7890

C:\Documents and Settings\gnaw0725>echo %ok:~4,-4%
56

C:\Documents and Settings\gnaw0725>echo %ok:~-4,-4%
ECHO is on.

C:\Documents and Settings\gnaw0725>echo %ok:~,-4%
123456

C:\Documents and Settings\gnaw0725>echo %ok:~-4%
7890

C:\Documents and Settings\gnaw0725>echo %ok:~4,%
ECHO is on.

SET扩展命令集有些特殊用法,例如:

%CD% - 展开为含目前目录的字串。(注:这个扩展功能较之For中的%~$PATH:I的用法要弱的多了)

%RANDOM% - 展开为一个在 0 和 32767 之间的整数乱数值。

%ERRORLEVEL% - 展开为目前的 ERRORLEVEL 值

%CMDEXTVERSION% - 展开为目前的扩充指令处理器的版本号码。

%CMDCMDLINE% - 展开为执行指令处理器前的原始指令行。

这些用法有待以后脚本运用中的实践。SET扩展命令集的帮助信息如下:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\gnaw0725>set /?
显示、设定或移除 cmd.exe 环境变数。

SET [variable=[string]]

variable 指定环境变数名称。
string     指定设定给变数的一系列字元。

仅键入 SET 而不加上任何参数,可以显示目前的环境变数。

如果您啟用了扩充命令,SET 指令有以下的改变:

如果执行 SET 命令而且只包含变数名称,没有等号或数值的话,指令会显示出所有字首符合 SET 命令中指定变数名称的所有变数
值。例如:

     SET P

会列出所有以 'P' 为开头的环境变数。

如果在目前的环境中找不到变数名称,SET 指令会将 ERRORLEVEL设为 1。

SET 指令不将等号 (=) 视为变数名称的一部份。

有两个新参数已经加到 SET 指令中:

     SET /A e?xpression
     SET /P variable=[promptString]

/A 指定在等号右方的字串是一个要被运算的数字运算式。您可以用运算式进行简单的运算,而且支援下列的运算子 (依照运算优先顺序由高到低排列):

     ()                   - 组成一群
     * / %               - 数字运算元
     + -                 - 数字运算元
     << >>               - 逻辑位移
     &                     - 位元运算 and
     ^                   - 位元运算 exclusive or
     |                   - 位元运算 or
     = *= /= %= += -=   - 指定
     &= ^= |= <<= >>=
     ,                   - 运算式分隔字元

如果您使用了任何逻辑或餘数运算子,您必须将运算式两边括上引号。任何在运算式中非数字的字串会被当作环境变数,并且在使用前会先将这些环境变数转换为数 字。如果您所指定的环境变数名称尚未在目前环境中定义,那麼它的值会被设为 0。这可以让您用环境变数值来做运算,而不必打入所有的 % 符号来取得它的值。如果 SET /A 是用指令档之外的指令行执行,它会显示运算式最后的数值。指定运算子需要有个环境变数在等号的左方。0x 字首在数字前方代表十六进位数字、0b 字首代表二进位数字或 0 字首代表八进位数字,否则数字值都是指十进位数字。所以 0x12 就和 18、022 等相同。请注意八进位数字可能容易弄错: 像 08 和 09 就不是正确的数字,因为 8 和 9 并不是八进位的正确数字。

/P 参数让您设定指令行的使用者输入变数值。在读取输入指令行之前,显示指定的 promptString。promptString 可以是空白。

环境变数取代功能已经有下列增强:

     %PATH:str1=str2%

会将 PATH 环境变数展开,取代每个发现的 "str1" 与 "str2"的扩充结果。"str2" 可以是空白字串,这会从扩充输出中删除全部 "str1"。"str1" 可以用星号开始,这将会从扩充输出的开头开始,对应到从所有第一个发现含有str1 的项目。

您也可以为扩充功能指定子字串。

     %PATH:~10,5%

这将会扩充 PATH 环境变数,然后只使用扩充结果的第 11 个(位移 10)字元后的 5 个字元如果长度未指定,将会预设为上次使用的变数值。如果数字(位或长度)是负数,使用的数字将会是环境变数的长度加上位移或指定长度。

     %PATH:~-10%

将抽出 PATH 变数的最后 10 个字元。

     %PATH:~0,-2%

将抽出 PATH 变数的最后 2 个字元。

最后,系统加入了延迟环境变数展开的支援。在预设状态下,指令展开会啟用这项支援,但是您可以在 CMD.EXE 用 /V 指令行参数来啟用/停用这个功能。 请参看 CMD /?

延迟环境变数展开功能可用来避开展开功能限制。这项限制是发生在指令行读取过程,不是发生在执行过程。下面的范例说明了立即展开变数时会发生的问题:

     set VAR=before
     if "%VAR%" == "before" (
         set VAR=after;
         if "%VAR%" == "after" @echo If you see this, it worked
     )

这个例子永远无法显示 echo 讯息,因为在两个 IF 叙述中的 %VAR% 会在第一个 IF 叙述被读入时便被展开。这是因为它是逻辑上包含了 IF 的内部,而内部又是一个复合叙述。 所以在复合叙述内的 IF 实际上是用"before" 和 "after" 来比较,而这永远不会为真。同样的,下面的例子也不会作用:

     set LIST=
     for %i in (*) do set LIST=%LIST% %i
     echo %LIST%

这个例子中并不会建立目前目录中所有档案的清单,相反的只会将 LIST 变数设为最后一个找到的档案。同样地,这是因为 %LIST% 只有在 FOR 叙述第一次被读入时才展开,此时 LIST 变数是空的。所以我们实际执行的 FOR迴圈是:

     for %i in (*) do set LIST= %i

这只是重复的将 LIST 设为最后找到的档案。

延迟环境变数展开让您可以用一个不同的字元 (惊嘆号) 在执行时展开环境变数。如果啟用了延迟环境变数展开,上面的例子可以被改写如下而正常作用:

     set VAR=before
     if "%VAR%" == "before" (
         set VAR=after
         if "!VAR!" == "after" @echo If you see this, it worked
     )

     set LIST=
     for %i in (*) do set LIST=!LIST! %i
     echo %LIST%

如果您啟用了扩充指令,有几个动态环境变数会被展开但是不会出现在 SET所显示的环境变数列表中。这些变数的值会每次在这些变数被展开时动态地重新计算如果使用者用这些变数的名称来定义变数时,则这个新定义会覆盖以下所列的动态变数:

%CD% - 展开为含目前目录的字串。

%DATE% - 展开为与 DATE 命令格式相同的目前日期字串。

%TIME% - 展开为与 TIME 命令格式相同的目前时间字串。

%RANDOM% - 展开为一个在 0 和 32767 之间的整数乱数值。

%ERRORLEVEL% - 展开为目前的 ERRORLEVEL 值

%CMDEXTVERSION% - 展开为目前的扩充指令处理器的版本号码。

%CMDCMDLINE% - 展开为执行指令处理器前的原始指令行。

rem CODE BY t0nsha 
rem 关于提取date,time输出结果的一个批处理 
rem “:”(冒号)和“~”波浪号必不可少! 
rem “~”后的数字:为正数表示舍弃输出结果的前几位;直接跟负数表示取到输出结果的后第几位。 
rem “,”后的数字:为正数表示取到输出结果的前第几位;为负数表示舍弃输出结果的后几位。 
echo %date% 
echo %date:~4% 
::下行表示舍弃前0位,取到第10位(即取输出结果的前10位) 
echo %date:~0,10% 
echo %date:~4,-5% 
pause 
echo %time% 
echo %time:~-3% 
echo %time:~2,-3% 
pause 
echo %date:~4% %time:~0,-3% 
pause



BTW

使用批处理产生日期(时间)文件、文件夹 帮别人整Sql     server自动备份
发现无法使用网络映射驱动器作为备份文件存放路径
而本机磁盘空间实在是不够
于是决定在本机只备份最新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个数值都随机取定)则只需写下以下代码(设置部分略去):

CODE:  
@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进行取零,代码如下:
CODE:  
@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循环
CODE:  
@echo off
set n=5
for /l %%i in (1,1,100) do set /a n+=1
echo %n%&pause>nul
  2.goto循环
CODE:  
@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中会有说明!



例7,

@echo off
if exist test\ (echo test 是文件夹) else echo test 是文件
pause



这里是判断文件夹是否存在。对于文件夹存在的判断,我们不可以用以下两种写法:

第①种

@echo off
if exist test\. (echo test 是文件夹) else echo test 是文件
pause





第②种

@echo off
if exist test\nul (echo test 是文件夹) else echo test 是文件
pause





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

这是一个判断变量是否已被定义的语句,我们还是先看例子,

例8,

@echo off

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 没有被定义



例9,

@echo off

set a=

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 没有被定义



注意:set a=这后面是没有空格的。



例10,

@echo off

set a=10

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 已定义



看了上面三个例子,你应该发现点什么了吧?现在我们应该知道了:当变量不存在或是值为空时,变量则为未定义。

当我们用if defined 变量 command 语句判断变量是否被定义时,请注意 变量 为不使用引导符号%的变量名,不能用写为%变量%,否则出错。



大家来试一下下面的这两个例子,

例11,

@echo off

set var1=5

if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)

set /p var2=请输入一个数字:

if defined %var2% (echo 变量var2已定义) else (echo 变量var2没有被定义)

pause



例12,

@echo off

set var1=5

if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)

set /p var2=请输入一个数字:

if defined var2 (echo 变量var2已定义) else (echo 变量var2没有被定义)

pause



注意例11和例12哦:一个是%var2%而另一个是var2





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

这个语句是用于判断上一个命令执行的返回值errorlevel,我们还是先来看看例子,

例13,

@echo off 

net user 

if %errorlevel% == 0 (echo net user 命令执行成功) else (echo net user 命令执行失败) 

Pause

注意:%errorlevel%  这是个系统变量,所以用两个%括起来,这里的==为两个连续的=

也许有些朋友说我上面的例子是不是写错了?按照语法应该写成“if errorlevel 0”才对的呀。

如果你是这样用的话,那你就错了,还真不信呀?OK,我们来设计个实验看看



例14,

@echo off 

set /p input=请输入任意一条命令: 

if errorlevel 0 (echo %input% 命令执行成功) else (echo %input% 命令执行失败)

pause

用这种语法,不管你前面的命令,是否执行成功,它都会认为命令成功了。何解?



if errorlevel  语句的特点:

当使用  if errorlevel 0 cmmand 句式时,它的含义是:如果返回的错误码值大于或等于0 的时候,将执行cmmand操作;

当使用  if %errorlevel%==0 cmmand 句式时,它含义是:如果返回的错误码值等于0 的时候,将执行cmmand操作。



一般上一条命令的执行结果返回的值只有两个,"成功"用0 表示 "失败"用 1 表示,实际上,errorlevel 返回值可以在0~255 之间,

例如xcopy 默认的errorlevel 值就有5 个,分别表示5 种执行状态:



0复制文件成功 
1 未找到复制文件 
2 用户通过CTRL+C 终止了xcopy操作 
4 出现了初始化错误  
5 出现了磁盘写入错误





对于if 条件语句,常用的也就上面那5条吧,下面我们来看一下它的两种格式:

if条件语句的完整格式是:if 条件表达式 (语句1) else (语句2) 

它的含义是:如果 条件表达式 成立,就执行 语句1,否则,将执行 语句2。  else后的 语句2 也可以不用括号括起。



if条件语句的简单格式是:if 条件表达式 (语句)

它的含义是:如果 条件表达式 成立,将执行 语句,否则,什么都不做。条件表达式后的 语句 也可以不用括号括起。



例15,

@echo off 

if exist "d:\123.txt" (del "d:\123.txt")

pause



你也可以写成下面这样哦~

例16,



@echo off 

if exist "d:\123.txt" "d:\123.txt"

pause





补充1:if not 语句

对于if 语句前面的5种基本语法,都可以加上not参数,如

1。if not "字符串1"=="字符串2" command 语句;

2。if not数值1 equ 数值2 command 语句;

3。If not exist filename command 语句;

4。if not defined 变量 command 语句;

5。if not errorlevel 数值 command 语句。



在if 条件表达式 (语句) 语句,如没有not参数,默认是判断条件成立时,执行语句;如有not参数,判断条件失败时,执行语句。



我们看一下下面的例子:



例17,

@echo off

if exist "c:\" (echo  C盘存在) else echo  C盘不存在

pause

执行后显示:C盘存在



例18,

@echo off

if not exist "c:\" (echo  C盘存在) else echo  C盘不存在

pause

执行后显示:C盘不存在

不会吧,例18中执行后显示:C盘不存在,这简值是在说瞎话了,那到底是什么回事呢?



if not exist "c:\" (echo  C盘存在) else echo  C盘不存在

此语句中文意思:如果不存在C:\ 就执行显示C盘存在;否则<指的是存在C:\>就执行显示C盘不存在。

注:if exist 意为如果存在,那么if not exist就是如果不存在



你的C盘当然是实实在在存在的啦,根椐上面的中文分得知,那执行例18后就显示为:C盘不存在  通过分析例18,你应该明白if语句中not参数是怎么用了吧!

上一篇:没有了
下一篇:批处理+vbs 上班自动打卡