使用批处理文件按日期清理目录

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 已经超出了范围,也许有某种方法可以使它成为全球性的还是什么?对不起,我对批处理文件处理很陌生所以我希望我不会误导你或其他什么,祝我好运,无论如何我都试过了......

可能是在您的代码中,它增加该变量的部分根本没有被执行,或者没有输入新数据,因为在第一个循环之后,它一直跳过更改该值的指令......或根本没有击中它,检查你在哪里使用该部分,如果某些索引需要增加,确保它确实在循环内,并且确保每次都被击中,我希望这会有所帮助...... :)

【讨论】:

以上是关于使用批处理文件按日期清理目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在批处理文件中按日期时间创建文件夹

使用批处理命令定期清理删除指定后缀文件,释放空间

请教批处理大虾,如何将一堆不同时期拍摄的照片按修改日期自动创建文件夹进行归档?

利用批处理实现按当前日期创建目录并备份

跳过在 Windows 98 批处理文件中输入新日期

怎么写批处理文件可以自动清理指定格式的文件?