2012-01-28 202 views
0

我正在处理批处理文件以读取文件夹中的文件,如果它们大于4天以前,请将它们移动到存档\ 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

问题在于以下两行:

for %%F in ("%source%\*") do (
    for /f "tokens=1,2,3 delims=/ " %%D in ("%%~tF") do (

第一个使用%% F可替换参数,但第二个使用%% D,%% E和%% F参数(%% D是显式的,%% E和%% F是隐式的,因为TOKENS = 1,2,3),所以%% F的第一个含义丢失了。只是改变了两个用于参数之一,例如:

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%值在所有值不断,但%fileDT%变化用在为每一个值。为了使这项工作,就是让已经一个FOR内或IF或括号改变一个变量的当前值,必须使用变量延迟扩展,即:

if /I %currdate% GTR !fileDT! (

,你必须在程序的开始部分包括此行:

setlocal EnableDelayedExpansion 
+0

您是对的,先生。我改变了参数,它的工作原理。但是,fileDT var在设置一次后不会更新。我在最后添加了一个SET fileDT =以清除它,但它仍然以所有后续文件的第一个文件的日期运行。对此有任何想法? – Dakine83 2012-01-28 01:42:33

1

我认为%%〜fF已经超出范围,也许有某种方法可以让它成为全局或某种东西?我很抱歉,我很新的批处理文件处理所以,我希望我不会指导你错误或什么,好运气,我试过反正...

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

相关问题