%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:最后显示的结果就是7:4:1。@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
五、递加(减、乘、除)运算
在批处理中我们经常要用到递加(减、乘、除)的运算,那怎么实现呢?只有通过循环来实现,有两种循环的方法:一种是for循环,一种是goto循环。如我们要对一个数值5进行递加100次变成105,两种方法的代码如下:
1.for循环
CODE:2.goto循环@echo off
set n=5
for /l %%i in (1,1,100) do set /a n+=1
echo %n%&pause>nul
CODE:同理可实现递减、乘、除和重复四则运算。@echo off
set n=5
:begin
set /a n+=1
if %n% neq 105 goto begin
echo %n%&pause>nul
我也就简单讲这么多了,主要是想给初学批处理的新手以自己微薄的帮助,还望各位高人予以补充和指教。