标题: [日期时间] 批处理如何删除指定日期之前的文件夹? [打印本页]
作者: breeze_li 时间: 2017-7-24 17:09 标题: 批处理如何删除指定日期之前的文件夹?
求助,怎样删除某个文件夹下,今天之前的所有文件夹(不是文件)。
作者: Batcher 时间: 2017-7-25 23:05
参考:http://bbs.bathome.net/thread-3503-1-1.html
作者: breeze_li 时间: 2017-7-26 18:35
本帖最后由 breeze_li 于 2017-7-26 18:36 编辑
回复 2# Batcher
E:\>rem 指定待删除文件夹的存放路径
E:\>set SrcDir=E:\asdf
E:\>rem 指定天数
E:\>set DaysAgo=1
E:\>for /F "skip=2 delims=" %a in ('reg query "HKEY_CURRENT_USER\Control Panel\I
nternational" /v sShortDate') do (set "RegDateOld=%a" )
E:\>(set "RegDateOld= sShortDate REG_SZ yyyy-M-d" )
E:\>set RegDateOld=yyyy-M-d
E:\>reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG
_SZ /d yyyy-M-d /f 1>nul
E:\>echo LastDate=date()-1 1>"C:\Users\Administrator\AppData\Local\Temp\DstDate.
vbs"
E:\>echo FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & righ
t("0" & day(LastDate),2) 1>>"C:\Users\Administrator\AppData\Local\Temp\DstDate.v
bs"
E:\>echo wscript.echo FmtDate 1>>"C:\Users\Administrator\AppData\Local\Temp\DstD
ate.vbs"
E:\>for /F %a in ('cscript /nologo "C:\Users\Administrator\AppData\Local\Temp\Ds
tDate.vbs"') do (set "DstDate=%a" )
E:\>(set "DstDate=20170725" )
E:\>set DstDate=2017-07-25
命令语法不正确。
E:\> if exist "%a\"
E:\>
请问,这是哪里有问题?
作者: Batcher 时间: 2017-7-27 22:37
回复 3# breeze_li
请把你测试用的bat文件压缩之后传上来我看看
作者: breeze_li 时间: 2017-7-28 09:03
回复 4# Batcher 这个是测试文件
作者: Batcher 时间: 2017-7-28 11:36
回复 5# breeze_li
3楼的报错信息看不出具体哪个命令在报错,单独执行这段有问题吗?- >"%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%
- echo %DstDate%
复制代码
作者: breeze_li 时间: 2017-7-28 15:09
回复 6# Batcher
C:\>test.bat
C:\>echo LastDate=date()- 1>"C:\Users\Administrator\AppData\Local\Temp\DstDate.v
bs"
C:\>echo FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & righ
t("0" & day(LastDate),2) 1>>"C:\Users\Administrator\AppData\Local\Temp\DstDate.v
bs"
C:\>echo wscript.echo FmtDate 1>>"C:\Users\Administrator\AppData\Local\Temp\DstD
ate.vbs"
C:\>for /F %a in ('cscript /nologo "C:\Users\Administrator\AppData\Local\Temp\Ds
tDate.vbs"') do (set "DstDate=%a" )
C:\Users\Administrator\AppData\Local\Temp\DstDate.vbs(1, 17) Microsoft VBScript
编译器错误: 语法错误
C:\>set DstDate=~0,4DstDate:~4,2DstDate:~6,2
C:\>echo ~0,4DstDate:~4,2DstDate:~6,2
~0,4DstDate:~4,2DstDate:~6,2
作者: Batcher 时间: 2017-7-28 15:59
回复 7# breeze_li
C:\Users\Administrator\AppData\Local\Temp\DstDate.vbs
把这个文件压缩传上来我看看
你用的什么版本的操作系统?
作者: breeze_li 时间: 2017-7-28 16:12
回复 8# Batcher
作者: Batcher 时间: 2017-7-28 21:59
回复 9# breeze_li - 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%
- echo %DstDate%
复制代码
这样呢?
作者: breeze_li 时间: 2017-7-31 09:00
回复 10# Batcher
C:\>test2.bat
C:\>set DaysAgo=1
C:\>echo LastDate=date()-1 1>"C:\Users\Administrator\AppData\Local\Temp\DstDate.
vbs"
C:\>echo FmtDate=right(year(LastDate),4) & right("0" & month(LastDate),2) & righ
t("0" & day(LastDate),2) 1>>"C:\Users\Administrator\AppData\Local\Temp\DstDate.v
bs"
C:\>echo wscript.echo FmtDate 1>>"C:\Users\Administrator\AppData\Local\Temp\DstD
ate.vbs"
C:\>for /F %a in ('cscript /nologo "C:\Users\Administrator\AppData\Local\Temp\Ds
tDate.vbs"') do (set "DstDate=%a" )
C:\>(set "DstDate=20170730" )
C:\>set DstDate=2017-07-30
C:\>echo 2017-07-30
2017-07-30
C:\>
好像是没报错
作者: Batcher 时间: 2017-7-31 09:02
回复 11# breeze_li
其它代码慢慢往上加,看看加到哪句的时候会报错。
作者: breeze_li 时间: 2017-7-31 15:10
回复 12# Batcher
for /d %%a in ("%SrcDir%\*.*") do (
if "%%~ta" leq "%DstDate%" (
if exist "%%a\"
echo rd /s /q "%%a"
)
)
)
加上这一句会报错,
命令语法不正确。
C:\> if exist "%a\"
作者: Batcher 时间: 2017-7-31 15:51
回复 13# breeze_li - for /d %%a in ("%SrcDir%\*.*") do (
- REM 看看这几个变量的值
- echo %SrcDir%
- echo %%a
- echo %%~ta
- echo %DstDate%
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a\"
- echo rd /s /q "%%a"
- )
- )
- )
复制代码
作者: breeze_li 时间: 2017-7-31 16:24
回复 14# Batcher
for /d %%a in ("%SrcDir%\*.*") do (
REM 看看这几个变量的值
echo %SrcDir%
echo %%a
echo %%~ta
echo %DstDate%
if "%%~ta" leq "%DstDate%" (
if exist "%%a\"
echo rd /s /q "%%a"
)
)
)
运行这段会直接报错,如果去掉
if "%%~ta" leq "%DstDate%" (
if exist "%%a\"
echo rd /s /q "%%a"
)
)
这段,那四个变量都能打印出来
作者: Batcher 时间: 2017-7-31 19:19
回复 15# breeze_li
可能之前更新帖子的时候有过误操作,原始代码第26行少了一个左括号,已更新,你再试试。
http://bbs.bathome.net/thread-3503-1-1.html
作者: breeze_li 时间: 2017-8-8 16:34
回复 16# Batcher - set SrcDir=E:\asdf
- set DaysAgo=1
- for /f "skip=2 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
- set "RegDateOld=%%a"
- )
- set RegDateOld=%RegDateOld:~-8%
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
- >"%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%
- echo %DstDate%
- for /d %%a in ("%SrcDir%\*.*") do (
- REM 看看这几个变量的值
- echo %SrcDir%
- echo %%a
- echo %%~ta
- echo %DstDate%
- if "%%~ta" leq "%DstDate%" (
- if exist "%%a\" (
- echo rd /s /q "%%a"
- )
- )
- )
- reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
复制代码
括号加了,现在不抱错了,但是好像没有执行删除操作
作者: Batcher 时间: 2017-8-8 17:45
回复 17# breeze_li
我代码里面已经写明了,可能你没注意到:- ::如果演示结果无误,把rd前面的echo去掉,即可实现真正删除。
复制代码
作者: Nsqs 时间: 2017-8-8 19:06
本帖最后由 Nsqs 于 2017-8-8 19:21 编辑
回复 18# Batcher
删除文件- PowerShell -c "Dir -File|ForEach{If(((Get-Date)-$_.LastWriteTime).Days -gt 30){Remove-Item $_.FullName}}"
复制代码
删除文件夹- PowerShell -c "Dir -Dir|ForEach{If(((Get-Date)-$_.LastWriteTime).Days -gt 30){Remove-Item $_.FullName}}"
复制代码
一行流,当前文件夹内删除30天前的文件
09年的帖子,方法太老了,嵌套VBS怎么写的这么复杂,请参见复制7天前的文件
作者: Batcher 时间: 2017-8-9 09:22
回复 19# Nsqs
是的,太老了,那时候混编的方法还没出现或者不流行。
作者: breeze_li 时间: 2017-8-10 08:47
回复 18# Batcher
谢谢耐心帮助,我用你帖子更新的 BAT + PowerShell 实现了
作者: kingshui 时间: 2017-8-16 17:15
forfiles也许更好?
作者: Batcher 时间: 2017-8-16 17:44
回复 22# kingshui
能否把完整代码发出来让楼主测试一下?
作者: kingshui 时间: 2017-8-18 12:42
本帖最后由 pcl_test 于 2017-8-18 12:49 编辑
回复 23# Batcher
楼主可参考,@isdir的值一定要大写。
详细用法forfiles /?复制代码
- forfiles /d -2017/8/18 /c "cmd /c if @isdir==TRUE rd /s/q @file"
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |