标题: [文件操作] [已解决]如何修改以下脚本实现删除文件名中包含指定日期串的文件 [打印本页]
作者: tianshiguodong 时间: 2011-12-22 00:46 标题: [已解决]如何修改以下脚本实现删除文件名中包含指定日期串的文件
本帖最后由 tianshiguodong 于 2011-12-23 14:32 编辑
由于我的文件名比较不规则,在使用以下批处理脚本时,无法确切判断时间,所以导致文件被错误删除,如我要删除一天前的文件,但我的的文件中有11_2011123119120303.txt,使用此脚本判断时就出现将19120303判断为日期并删除。我想可以通过在循环中加入截取时间字符串的操作后再判断,但不知如何加,还请各位指点下
另外我的文件规则是11_20111111*.txt和12_20111111*.txt类似这样的文件,*为长度固定的数字格式
@echo off
::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
rem 指定待删除文件的存放路径
set SrcDir=F:\201221test\smppbillstore
rem 指定天数
set DaysAgo=1
>"%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
作者: tianshiguodong 时间: 2011-12-22 11:23
自已先顶下
如何在循环语句中实现对*.*文件的截取前几位字符的操作
for /r "%SrcDir%" %%a in (*.*) do ()
试了下在in后面用 set但好像不行
作者: yyykkkyyyy 时间: 2011-12-22 11:29
本帖最后由 yyykkkyyyy 于 2011-12-22 11:58 编辑
把此行及以下去掉:set DstDate=%DstDate:~0,4% ^& %DstDate:~4,2% ^& %DstDate:~6,2%
换成下面代码(原代码只显示没删,这个也是):- setlocal enabledelayedexpansion
- for /r "%SrcDir%" %%a in (*_????????*.txt) do (
- set "FileName=%%~na"
- set "_FileName=!FileName:*_=!"
- if "!_FileName!" lss "%DstDate%A" (
- echo del /f /q "%%a"
- )
- )
- endlocal
- pause
复制代码
作者: tianshiguodong 时间: 2011-12-22 11:52
回复 3# yyykkkyyyy
多谢3楼yyykkkyyyy 的指点,没做过开发,怎么感觉批处理编写程序比较随意,变量也不定义,似乎比其它语言要难一些,有些也看不大懂
其中set "FileName=%%~na"是干什么的,怎么加引号,里面的~na表示什么意思
还有我看有的脚本里有:~这个表示什么意思
作者: Demon 时间: 2011-12-22 11:54
原来VBS已经落寞到给批处理当垫脚石了- 'Author: Demon
- 'Website: http://demon.tw
- 'Date: 2011/12/22
- Const SrcDir = "F:\201221test\smppbillstore"
- Const DaysAgo = 1
- DstDate = Replace(Date - DaysAgo, "/", "")
- Set re = New RegExp
- re.Pattern = DstDate
- Set fso = CreateObject("scripting.filesystemobject")
- For Each file In fso.GetFolder(SrcDir).Files
- If re.Test(file.Name) Then
- WScript.Echo file.Name
- 'file.Delete
- End If
- Next
复制代码
作者: yyykkkyyyy 时间: 2011-12-22 12:14
回复 4# tianshiguodong
是比较灵活,还有数据类型也是,用到set/a 时就算数据型了,肯定不会难些,主要是把一些现成命令或程序按各自语法套用
就象所问的%%~na 表示取其文件主名,要参见各命令帮助 这个在命令行见for/? 或call/?
作者: awk 时间: 2011-12-22 23:59
回复 4# tianshiguodong
给变量赋值的时候加上双引号是为了防止特殊符号可能带来的隐患。
其实BAT一点都不难,关键是你没有学。如果拿出学C语言十分之一的时间和精力来学习BAT,那简直是小菜一碟。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |