使用批处理文件按日期清理目录
Posted
技术标签:
【中文标题】使用批处理文件按日期清理目录【英文标题】:Using a Batch File to clean up a directory by date 【发布时间】:2012-02-20 22:59:57 【问题描述】:我正在处理一个批处理文件来读取文件夹中的文件,如果它们超过 4 天,请将它们移动到 archive\YYYY\MM 文件夹结构中。这是当前的代码
::根据文件年月移动错误文件夹中的文件以存档 @echo 关闭 设置“源=C:\用户\用户\桌面\测试” 设置“targetRoot=C:\Users\user\Desktop\test\archive” 对于 /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') 做@( 设置 mm=%%A 设置 dd=%%B 设置 yyyy=%%C ) 设置 currdate=%yyyy%%mm%%dd% ::echo %currdate% 设置 /a currdate-=7 ::echo %currdate% 对于 ("%source%\*") 中的 %%F 执行 ( for /f "tokens=1,2,3 delims=/ " %%D in ("%%~tF") 做 ( SET 文件DT=%%F%%D%%E 如果 /I %currdate% GTR %fileDT% ( 如果不存在 "%targetRoot%\%%F" mkdir "%targetRoot%\%%F" 如果不存在 "%targetRoot%\%%F\%%D" mkdir "%targetRoot%\%%F\%%D" move "%%~fF" "%targetRoot%\%%F\%%D" ) ) )
问题是我添加了之后
if /I %currdate% GTR %fileDT%行,它不再知道 %%~fF 是什么,因此也不知道要移动哪个文件。
我应该注意我是批处理文件的新手,我主要修改我在网上找到的代码。
【问题讨论】:
【参考方案1】:问题出在这两行:
for %%F in ("%source%\*") do (
for /f "tokens=1,2,3 delims=/ " %%D in ("%%~tF") do (
第一个 FOR 使用 %%F 可替换参数,但第二个 FOR 使用 %%D、%%E 和 %%F 参数(%%D 是显式的,%%E 和 %%F 是隐式的,因为 TOKENS =1,2,3),所以 %%F 的第一个含义丢失了。只需更改两个 FOR 参数之一,例如:
for %%F in ("%source%\*") do (
for /f "tokens=1,2,3 delims=/ " %%X in ("%%~tF") do (
SET fileDT=%%Z%%X%%Y
编辑:回答评论中所述的第二个问题。
在这一行:
if /I %currdate% GTR %fileDT% (
%currdate% 值对于 FOR 中的所有值都是常数,但 %fileDT% 随着 FOR 中的每个值而变化。为了使其工作,即获取在 FOR 或 IF 或括号内发生变化的变量的当前值,必须使用延迟变量扩展,即:
if /I %currdate% GTR !fileDT! (
并且您必须在程序的开头包含此行:
setlocal EnableDelayedExpansion
【讨论】:
您说得对,先生。我改变了参数,它工作。但是,fileDT var 在设置一次后不会更新。我在末尾添加了一个 SET fileDT= 来清除它,但它仍然以所有后续文件的第一个文件的日期运行。对此有什么想法吗?【参考方案2】:我认为 %%~fF 已经超出了范围,也许有某种方法可以使它成为全球性的还是什么?对不起,我对批处理文件处理很陌生所以我希望我不会误导你或其他什么,祝我好运,无论如何我都试过了......
可能是在您的代码中,它增加该变量的部分根本没有被执行,或者没有输入新数据,因为在第一个循环之后,它一直跳过更改该值的指令......或根本没有击中它,检查你在哪里使用该部分,如果某些索引需要增加,确保它确实在循环内,并且确保每次都被击中,我希望这会有所帮助...... :)
【讨论】:
以上是关于使用批处理文件按日期清理目录的主要内容,如果未能解决你的问题,请参考以下文章