2012-01-28 93 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已經超出範圍,也許有某種方法可以讓它成爲全局或某種東西?我很抱歉,我很新的批處理文件處理所以,我希望我不會指導你錯誤或什麼,好運氣,我試過反正...

它可能是在你的代碼中,它增加的部分變量根本沒有被執行,或者新的數據沒有被輸入,因爲在第一次循環之後,它會一直跳過改變該值的指令......或者根本沒有打開它,檢查你正在使用該部分的位置如果一些索引需要增加確保它確實並且在循環內,並且每次肯定會被擊中一次,所以我希望這有助於...... :)