标题: [文件操作] 如何修改以下批处理实现删除文件名中包含指定日期串的文件? [打印本页]
作者: zbgxg 时间: 2017-2-18 14:03 标题: 如何修改以下批处理实现删除文件名中包含指定日期串的文件?
如何用批处文件删除N天前以日期规律命名的文件,文件的名字为 abc0116-0205.xls 2017-02-13 221047 或者 ef0123609-0123315.xls 2017-02-13 083946 ,就是文件的名字前部分长度什么的没有规律,后部分都 2017-02-13 083946 这样,年-月-日 时分秒,怎么用BAT文件来实现?
下面的例子只能删除bak-2009-12-25格式命名的文件,对我的这些不起作用,请高手帮忙解决下- @echo off
- ::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
- ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
- ::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
- rem 指定待删除文件的存放路径
- set SrcDir=H:/Test1
- rem 指定天数
- set DaysAgo=5
- >"%temp%/DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%/DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%/DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%/DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4% ^& %DstDate:~4,2% ^& %DstDate:~6,2%
- setlocal enabledelayedexpansion
-
- for /r "%SrcDir%" %%a in (*.*) do (
- set "FileDate=%%~na"
- set "FileDate=!FileDate:~4,10!"
- if "!FileDate!" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- endlocal
- pause
复制代码
作者: zbgxg 时间: 2017-2-20 10:34
请问各位高手,可以实现吗?
作者: GNU 时间: 2017-2-20 20:50
set "FileDate=%%~na"
set "FileDate=!FileDate:~4,10!"
改成:
set "FileDate=%%~nxa"
set "FileDate=!FileDate:~-17,10!"
作者: zbgxg 时间: 2017-2-21 12:41
set "FileDate=%%~na"
set "FileDate=!FileDate:~4,10!"
改成:
set "FileDate=%%~nxa"
set "FileDat ...
GNU 发表于 2017-2-20 20:50
谢谢,改成上面的的语句后,好像判断时间不对了,不管选择删除多少天前的内容,都是删除此文件夹下面所有这种格式的文件。
作者: zbgxg 时间: 2017-2-21 12:41
是不是别的地方也需要改啊?
作者: GNU 时间: 2017-2-21 19:18
回复 5# zbgxg
打开CMD窗口,切换到你的文件所在的目录,执行命令 dir /b 把结果发出来我看一下。
作者: zbgxg 时间: 2017-2-22 07:03
回复 6# GNU
set DaysAgo=10 不管设定为几天,都是删除全部文件,麻烦帮忙给看下
作者: GNU 时间: 2017-2-22 19:32
回复 7# zbgxg
set "FileDate=%%~nxa"
set "FileDate=!FileDate:~-21,10!"
作者: zbgxg 时间: 2017-2-23 09:20
回复 8# GNU
换上面的代码,啥也删除不了。。。。。。。。。。。。改多少天都不管用
作者: GNU 时间: 2017-2-23 13:32
回复 9# zbgxg - set SrcDir=H:/Test1
- rem 指定天数
- set DaysAgo=5
- >"%temp%/DstDate.vbs" echo LastDate=date()-%DaysAgo%
- >>"%temp%/DstDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
- >>"%temp%/DstDate.vbs" echo wscript.echo FmtDate
- for /f %%a in ('cscript /nologo "%temp%/DstDate.vbs"') do (
- set "DstDate=%%a"
- )
- set DstDate=%DstDate:~0,4% ^& %DstDate:~4,2% ^& %DstDate:~6,2%
- setlocal enabledelayedexpansion
-
- for /r "%SrcDir%" %%a in (*.*) do (
- echo [1] !FileDate!
- set "FileDate=%%~nxa"
- echo [2] !FileDate!
- set "FileDate=!FileDate:~-21,10!"
- echo [3] %DstDate%
- if "!FileDate!" leq "%DstDate%" (
- if exist "%%a" (
- echo del /f /q "%%a"
- )
- )
- )
- endlocal
- pause
复制代码
把这个代码的执行结果发出来看看,这样能知道为什么出错。
作者: zbgxg 时间: 2017-2-24 08:50
回复 10# GNU
作者: GNU 时间: 2017-2-24 09:56
回复 11# zbgxg
你现在知道问题出在什么地方了吧?
2017-02-13 221047 这种日期时间字符串在你的文件名里面的出现的位置不一定,没有任何规律,导致 set 命令截取不到正确的字符串。
顶楼这个代码的思路是要求文件名有规律。要么从左往右第几个字符是日期,要么从右往左第几个字符是日期。
作者: zbgxg 时间: 2017-2-24 17:56
回复 12# GNU
那就是说用脚本语言实现不了这个功能,就是日期前面字符没有规律
作者: GNU 时间: 2017-2-25 11:04
回复 13# zbgxg
BAT的正则表达式功能不完善,可以调用第三方命令行工具,或者改用其它脚本。
作者: yu2n 时间: 2017-2-25 17:49
回复 13# zbgxg
悄悄的告訴你,腳本語言可以做到的。
你聽說過BAT么?這是一種超簡單的腳本語言,它能取到文件名稱~這個你會了。說個你不會的,它有個findstr命令,支持正則哦。- findstr /rx "^.*[0-9][0-9]-[0-9][0-9]-[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9]\..*$"
复制代码
是不是棒棒達?聽說還有一些高級的腳本語言,能上天入地,翻江倒海,樓主要不要認識一下?
作者: GNU 时间: 2017-2-25 17:59
回复 15# yu2n
又看了一遍 findstr 的正则,没有发现它能解决楼主的问题,能否把你的代码放出来学习一下?
作者: yu2n 时间: 2017-2-25 19:39
本帖最后由 yu2n 于 2017-2-25 19:42 编辑
回复 16# GNU
解决什么问题?要我为楼主写软件就免了,我写不了这样的软件。
findstr 的主要功能是匹配字符串。
我前面的发的正则代码不能匹配么?我测试了楼主的那几个例子,findstr 起到了它应有的作用,它找出了那些带日期的文件名。
当然,我不指望一行 findstr 就搞定计算日期范围/删除文件这些功能吧,微软可没有为 findstr 加这些功能。
作者: GNU 时间: 2017-2-25 19:55
回复 17# yu2n
你可能没有理解楼主的需求,他的文件名里面都有日期,不需要用findstr查找。
他这个问题的难点在于日期字符串在文件名里面的位置不固定,findstr的正则不足以解决这个难点。
作者: yu2n 时间: 2017-2-25 20:04
回复 18# GNU
我没看错的话,楼主举的第一个文件名例子是 abc0116-0205.xls 。
这个里面没有日期吧,难道不应该用 findstr 把这些不相干的文件排除么?- @rem --
- @rem win10 x64
- @rem --
- @echo off & cls
- pushd "%~dp0"
- echo.>"abc0116-0205.xls"
- echo.>"2017-02-13 221047.bak"
- echo.>"ef0123609-0123315.xls"
- echo.>"2017-02-13 083946.bak"
- echo.>"2017-02-13 083946.bak"
- echo.>"bak-2009-12-25.bak"
-
- echo 当前文件列表:
- dir /a /b
- echo.
- echo 匹配格式:*yyyy-mm-dd hhmmss.*
- dir /a /b | findstr /r "^.*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].*[0-9][0-9][0-9][0-9][0-9][0-9]\..*$"
- echo.
- echo 匹配格式:*yyyy-mm-dd.*
- dir /a /b | findstr /rx "^.*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\..*$"
- echo.
- pause
复制代码
作者: GNU 时间: 2017-2-25 20:53
回复 19# yu2n
abc0116-0205.xls 2017-02-13 221047
或者
ef0123609-0123315.xls 2017-02-13 083946
就是文件的名字前部分长度什么的没有规律,后部分都 2017-02-13 083946 这样,年-月-日 时分秒
我是这样理解的,他顶楼说的是2个文件而不是4个文件。
作者: zbgxg 时间: 2017-2-26 17:34
回复 yu2n
我是这样理解的,他顶楼说的是2个文件而不是4个文件。
GNU 发表于 2017-2-25 20:53
楼上正解!我所有的的文件名字都是以xxxx-xx-xx xxxxxx 作为文件名的结尾, 即4位年,两位日和月,加一个空格后面是小时分钟和秒各两位,这是固定格式,但是文件 名的前半部分是没有任何规律的字符个数不确定
作者: GNU 时间: 2017-2-26 17:55
回复 21# zbgxg
但是你15楼给的测试用例不是以xxxx-xx-xx xxxxxx 作为文件名的结尾,“副本”神马的怎么也出来了?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |