[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 4# 0475


   
修订后的脚本如下,请测试
  1. @echo off
  2. @rem 保存为ANSI格式
  3. set "SrcDir=E:\0006\222"
  4. set "DaysAgo=7"
  5. pushd "%SrcDir%"
  6. forfiles /p "%SrcDir%" /s /m *.* /d -%DaysAgo% /c "cmd /c if @isdir==FALSE del @path" >nul 2>&1
  7. setlocal enabledelayedexpansion
  8. for /f "delims=" %%a in ('dir/b/s/ad^|sort/r') do (
  9. set "Empty_Folder="
  10. for /f "delims=" %%b in ('dir/a/b "%%~a"') do set "Empty_Folder=%%~b"
  11. if "!Empty_Folder!." equ "." rd/q/s "%%~a">nul 2>&1
  12. )
  13. endlocal
  14. popd
复制代码

TOP

回复 6# xiaoyuwxz


把方案5的第25行
set "FolderDate=!FolderDate:~8,10!"
改成
set "FolderDate=!FolderDate:~0,10!"
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# Batcher


   我使用了第五个方案的代码,没有动作,请帮忙分析下原因。

现目录下的文件如下:
G:\beifen 的目录

2022-11-28  23:46    <DIR>          .
2022-11-28  23:46    <DIR>          ..
2022-11-28  23:08    <DIR>          2018-07-08
2022-11-28  23:08    <DIR>          2018-07-10
2022-11-28  23:08    <DIR>          2018-07-17
2022-11-28  23:07    <DIR>          2021-07-23
2022-11-28  23:08    <DIR>          2022-07-06
2022-11-28  23:07    <DIR>          2022-11-25
2022-11-28  23:07    <DIR>          2022-11-26
2022-11-28  23:07    <DIR>          2022-11-27
2022-11-28  23:07    <DIR>          2022-11-28
2022-11-28  23:46             3,651 a.txt
2022-11-28  23:46                 0 b.txt
2021-07-23  10:40               264 backup.log
2018-07-17  11:57             1,431 beifen - 副本.bat
2018-07-17  10:58             1,432 beifen.bat
2022-11-28  23:38             1,175 ddeell.bat

生成的DstDate.vbs 内容为:
LastDate=date()-3
FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & right("0" & day(LastDate),2)
wscript.echo FmtDate

运行ddeell.bat得到 的内容为:


G:\beifen>REM ----------------------------------------------------------------------------------------

G:\beifen>REM 演示:删除指定路径下指定天数之前(以文件夹名中包含的日期字符串为准)的文件夹。

G:\beifen>REM 如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。

G:\beifen>REM 本例假设文件夹名中包含的日期字符串(比如:Archive-2009-12-25)

G:\beifen>REM ----------------------------------------------------------------------------------------

G:\beifen>REM 指定待删除文件夹的存放路径

G:\beifen>set SrcDir=G:\beifen

G:\beifen>REM 指定天数

G:\beifen>set DaysAgo=3

G:\beifen>echo LastDate=date()-3 1>"C:\Users\ADMINI~1\AppData\Local\Temp\DstDate.vbs"

G:\beifen>echo FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & right("0" & day(LastDate),2) 1>>"C:\Users\ADMINI~1\AppData\Local\Temp\DstDate.vbs"

G:\beifen>echo wscript.echo FmtDate 1>>"C:\Users\ADMINI~1\AppData\Local\Temp\DstDate.vbs"

G:\beifen>for /F %a in ('cscript /nologo "C:\Users\ADMINI~1\AppData\Local\Temp\DstDate.vbs"') do (set "DstDate=%a" )

G:\beifen>(set "DstDate=20221125" )

G:\beifen>set DstDate=2022-11-25

G:\beifen>setlocal enabledelayedexpansion

G:\beifen>for / %a in ("G:\beifen\*.*") do (if "%~ta" LEQ "2022-11-25" (
set "FolderDate=%~na"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "%a\" (rd /s /q "%a" ) )
) )

G:\beifen>(if "2022-11-28 23:08" LEQ "2022-11-25" (
set "FolderDate=2018-07-08"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2018-07-08\" (rd /s /q "G:\beifen\2018-07-08" ) )
) )

G:\beifen>(if "2022-11-28 23:08" LEQ "2022-11-25" (
set "FolderDate=2018-07-10"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2018-07-10\" (rd /s /q "G:\beifen\2018-07-10" ) )
) )

G:\beifen>(if "2022-11-28 23:08" LEQ "2022-11-25" (
set "FolderDate=2018-07-17"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2018-07-17\" (rd /s /q "G:\beifen\2018-07-17" ) )
) )

G:\beifen>(if "2022-11-28 23:07" LEQ "2022-11-25" (
set "FolderDate=2021-07-23"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2021-07-23\" (rd /s /q "G:\beifen\2021-07-23" ) )
) )

G:\beifen>(if "2022-11-28 23:08" LEQ "2022-11-25" (
set "FolderDate=2022-07-06"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2022-07-06\" (rd /s /q "G:\beifen\2022-07-06" ) )
) )

G:\beifen>(if "2022-11-28 23:07" LEQ "2022-11-25" (
set "FolderDate=2022-11-25"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2022-11-25\" (rd /s /q "G:\beifen\2022-11-25" ) )
) )

G:\beifen>(if "2022-11-28 23:07" LEQ "2022-11-25" (
set "FolderDate=2022-11-26"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2022-11-26\" (rd /s /q "G:\beifen\2022-11-26" ) )
) )

G:\beifen>(if "2022-11-28 23:07" LEQ "2022-11-25" (
set "FolderDate=2022-11-27"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2022-11-27\" (rd /s /q "G:\beifen\2022-11-27" ) )
) )

G:\beifen>(if "2022-11-28 23:07" LEQ "2022-11-25" (
set "FolderDate=2022-11-28"  
set "FolderDate=!FolderDate:~8,10!"  
if "!FolderDate!" LEQ "2022-11-25" (if exist "G:\beifen\2022-11-28\" (rd /s /q "G:\beifen\2022-11-28" ) )
) )

G:\beifen>endlocal

G:\beifen>pause
请按任意键继续. . .

TOP

回复 1# xiaoyuwxz


批处理删除指定天数日期之前的文件夹:方案5
http://bbs.bathome.net/thread-3503-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复  hfxiang
谢谢你的指点。

我试了这个命令,它是以目录的修改日期来判断,而删除日期目录内的子目 ...
xiaoyuwxz 发表于 2022-11-28 15:33



rem 下面为只删除指定目录下的子文件夹和文件,不删除本身目录 ,文件夹名称后面不要添加 \ 字符
set "SrcDir=E:\0006\222"
rem 下面为指定天数之前
set DaysAgo=7

::说明:彻底删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件夹和文件。是彻底删除,并不会出现在回收站里。
forfiles /p %SrcDir% /s /m "*" /d -%DaysAgo% /c "cmd /c del /f /q @path & RD /S /Q @path"

TOP

回复 2# hfxiang
谢谢你的指点。

我试了这个命令,它是以目录的修改日期来判断,而删除日期目录内的子目录,在有残留目录的时候,遍历时间很长,而且会显示报错“错误:系统找不到指定的文件。”
测试中还发现这命令还有个缺点,一旦它自动地删除了最下级目录的文件或目录(目录内还有多级子目录和文件的存在),其父目录的修改时间就会改变,继而就不再删除父目录了。命令执行结束后,还有好多目录还是都存在着。

我设想的是直接根据目录的内容(就是日期形式,用日期格式来做运算)来判断,继而直接rd掉这个日期格式目录(最外层的这个目录)

TOP

本帖最后由 hfxiang 于 2022-11-28 09:57 编辑
  1. forfiles /p "E:\备份文件" /s /m *.* /d -30 /c "cmd /c if @isdir==TRUE rd /s/q @path"
复制代码

TOP

返回列表