Board logo

标题: [文件操作] [已解决]如何修改以下脚本实现删除文件名中包含指定日期串的文件 [打印本页]

作者: 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%
换成下面代码(原代码只显示没删,这个也是):
  1. setlocal enabledelayedexpansion                                                   
  2. for /r "%SrcDir%" %%a in (*_????????*.txt) do (                        
  3.     set "FileName=%%~na"                                                         
  4.     set "_FileName=!FileName:*_=!"                                                
  5.     if "!_FileName!" lss "%DstDate%A" (                                             
  6.         echo del /f /q "%%a"                                                   
  7.     )                                                                              
  8. )                                                                                 
  9. endlocal                                                                           
  10. pause
复制代码

作者: tianshiguodong    时间: 2011-12-22 11:52

回复 3# yyykkkyyyy


    多谢3楼yyykkkyyyy 的指点,没做过开发,怎么感觉批处理编写程序比较随意,变量也不定义,似乎比其它语言要难一些,有些也看不大懂
    其中set "FileName=%%~na"是干什么的,怎么加引号,里面的~na表示什么意思
    还有我看有的脚本里有:~这个表示什么意思
作者: Demon    时间: 2011-12-22 11:54

原来VBS已经落寞到给批处理当垫脚石了
  1. 'Author: Demon
  2. 'Website: http://demon.tw
  3. 'Date: 2011/12/22
  4. Const SrcDir = "F:\201221test\smppbillstore"
  5. Const DaysAgo = 1
  6. DstDate = Replace(Date - DaysAgo, "/", "")
  7. Set re = New RegExp
  8. re.Pattern = DstDate
  9. Set fso = CreateObject("scripting.filesystemobject")
  10. For Each file In fso.GetFolder(SrcDir).Files
  11.     If re.Test(file.Name) Then
  12.         WScript.Echo file.Name
  13.         'file.Delete
  14.     End If
  15. 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