最近写了个批处理文件,实现的功能是:一个文件夹(比如a文件夹)里面有很多子文件夹,需要找到最新的2个子文件夹(最近修改时间)。刚开始的思路是:得到a里面每个子文件夹的修改时间,然后比较,这样虽然思路清晰,但是却非常麻烦,特别是如果子文件夹很多运算就很多,还要涉及到日期的比较,特别麻烦,不可取。后来采取的方法是:把a里面的子文件夹名字取出来,按照修改时间先后排序(b文件),然后取出最后面的2条记录。这样思路也非常清晰,但是这样又有新的问题了,怎么从b文件里取出最后面的两条记录。在这个地方我卡了大半天(也许dos批处理命令真的太弱,或者我太菜了,没有找到像head之类的方法,edit文件也没成功,如果有高手知道,麻烦留言告知一下),后来实在没辙了就绕了个弯实现了这个功能。思路如下:先得到b文件的行数(假如为length),然后循环b文件跳过length-2行,也就是从倒数第二行开始往下循环,这样刚好得到最后两行的记录,也就是最新修改过的前2个子文件夹。
代码如下:
rem D:\test是a文件夹
d:
cd D: \ test
rem 得到b文件(E:\directory)
dir / b / o :d > E: \ directory
rem 得到类型为 “行数:最后一行内容”的字符串(str)
for / f " tokens=1 delims= " %%i in ( 'findstr / n " . " E: \ directory' ) do echo %%i > str
rem 截取行数(length)
for / f " tokens=1 delims=: " %%a in ( str ) do set / a length = %%a
rem 得到需要跳过循环的行数
set / a span = length- 2
rem 得到最后的两个记录
for / f " skip=%span% " %%j in ( E: \ directory ) do echo %%j
del / q str
del / q E: \ directory
如果想得到最新修改文件(不是文件夹)的时间可以用下面的命令:
d:
cd D: \ test
( for / f " delims= " %%a in ( ' dir / B / AD " D:\test " ' ) do (
set a = %%a
setlocal enabledelayedexpansion
set / p = !a! < nuls
for / f " tokens=2 delims==. " %%b in ( 'wmic datafile where name^ = " !a:\=\\! " get LastModified / value' ) do echo %%b
Endlocal
))> result . txt
也可以得到LastAccessed, LastModified, Name, FileSize等数据,可以参考:http://technet.microsoft.com/zh-cn/library/cc758713(WS.10).aspx,或者
http://qlj.sh.cn/system/20090430/wmic-command/。
欢迎高手 批评指正。