删除后缀名较小的日期

2016-01-07  本文已影响34人  禾白小三飘

问题要求

求一段bat指令实现如下功能
文件夹内有很多文件比如

a.txt.1 a.txt.2 a.txt.3 --a.txt.n
b.txt.1 b.txt.2 b.txt.3 --b.txt.n
.
.
x.txt.1 x.txt.2 x.txt.3 --x.txt.n

例如文件*.txt.n 其中"n"是文件版本号,现在想保留最高版本删除其他的版本.

根据网友的提问,建立了一个测试环境。

2015/05/12  11:08  1.txt.1
2015/05/12  11:08  1.txt.2
2015/05/12  11:08  1.txt.3
2015/05/12  11:08  1.txt.4
2015/05/12  11:08  1.txt.5
2015/05/12  12:01  1.txt.6
2015/05/12  11:08  2.txt.3
2015/05/12  11:08  2.txt.4
2015/05/12  13:40  2.txt.5

跳转法:

@echo off & setlocal enabledelayedexpansion
cd d:\test
::取一个不含后缀的文件名
for %%i in (*.txt.*) do (
set fname=%%~ni
call :1
)
echo 执行完成 & pause >nul & exit

:1
set fsum=0
for %%a in (%fname%.*) do set /a fsum+=1
echo 文件名:%fname% 数量:%fsum%
::判断该文件名的数量,如果只有1个就回去call继续下一个文件名,如果不是1个就继续执行后面的命令
if %fsum% equ 1 goto :eof
for /f "delims=" %%i in ('dir /od /b /a-d %fname%.*') do (set endf=%%i & set endt=%%~ti)
::通过按照日期排序,排在最后的是最新的文件,将文件的文件名和日期保存到变量中。
echo 最后的文件是:%endf% %endt%
echo 确认删除其他文件? & pause >nul 
::小于最新文件的执行删除操作
for /f "delims=" %%i in ('dir /od /b /a-d %fname%.*') do (
 if "%%~ti" lss "%endt%" del %%i
)
goto :eof
::删除完成,回到call的地方,继续下一个文件判断。

思路是:
获取一个文件名(不含后缀),然后判断相同的文件名有多少个。最后删除按照日期排序的旧文件。

For循环法

@echo off & setlocal enabledelayedexpansion
cd d:\test
for /f "delims=" %%i in ('dir /b /a-d *.txt.*') do (
 if %%~ti GTR !mm%%~ni! set mm%%~ni=%%~ti
)
for /f "tokens=1,2 delims=m=" %%i in ('set mm') do (
 for /f "delims=" %%a in ('dir /b /a-d %%i.*') do (
 if %%j NEQ %%~ta del %%a
 )
)

思路是:
通过逐个文件对比得到日期最新的文件,然后如果其他文件日子不等于最新的日期,则执行删除操作。

上一篇下一篇

猜你喜欢

热点阅读