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

时间:2012-01-28 00:57:35

标签: batch-file

我正在处理批处理文件以读取文件夹中的文件,如果它们超过4天,则将它们移动到archive \ YYYY \ MM文件夹结构中。这是现在的代码

::MOVE FILES THAT ARE IN THE ERROR FOLDER TO ARCHIVE ACCORDING TO FILES YEAR AND MONTH

@echo off

set "source=C:\Users\user\Desktop\test"
set "targetRoot=C:\Users\user\Desktop\test\archive"
For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @(
    set mm=%%A
    set dd=%%B
    set yyyy=%%C
)
set currdate=%yyyy%%mm%%dd%
::echo %currdate%
set /a currdate-=7
::echo %currdate%
for %%F in ("%source%\*") do (
    for /f "tokens=1,2,3 delims=/ " %%D in ("%%~tF") do (
    SET fileDT=%%F%%D%%E

    if /I %currdate% GTR %fileDT%  (
        if not exist "%targetRoot%\%%F" mkdir "%targetRoot%\%%F"
        if not exist "%targetRoot%\%%F\%%D" mkdir "%targetRoot%\%%F\%%D"
        move "%%~fF" "%targetRoot%\%%F\%%D"
        )

    )
)

问题是,在我添加了

if /I %currdate% GTR %fileDT%
行后,它不再知道%% ~fF是什么,因此要移动哪个文件。

我应该注意到我对批处理文件不熟悉,而且我主要修改我在网上发现的代码。

2 个答案:

答案 0 :(得分:2)

问题在于以下两行:

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%  (

对于FOR中的所有值,%currdate%值为常量,但%fileDT%对FOR中的每个值进行更改。为了使其工作,即,为了获得在FOR或IF或括号内变化的变量的当前值,必须使用延迟变量扩展,即:

if /I %currdate% GTR !fileDT!  (

并且您必须在程序的beginnng中包含此行:

setlocal EnableDelayedExpansion

答案 1 :(得分:1)

我认为%% ~fF已超出范围可能有某种方式使其成为全球性的东西?对不起,我对批处理文件处理很陌生所以我希望我不会错误地引导你或者什么东西,祝我好运,不管怎么说......

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