Использование пакетного файла для очистки каталога по дате - PullRequest
0 голосов
/ 28 января 2012

Я работаю над командным файлом, чтобы прочитать файлы в папке, и если они старше 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 ]

2 голосов
/ 28 января 2012

Проблема в этих двух строках:

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
1 голос
/ 28 января 2012

я думаю, что %% ~ fF выпал из области видимости, может быть, есть какой-то способ сделать его глобальным или что-то в этом роде?Извините, я довольно новичок в пакетной обработке файлов, так что я надеюсь, что я вас не обману или что-то в этом роде, удачи, я все равно попробовал ...

Возможно, в вашем коде та часть, где онувеличивает, что переменная вообще не выполняется или новые данные не вводятся, потому что после первого цикла она продолжает пропускать инструкцию, которая изменяет это значение ... или вообще не выполняет ее, проверьте, где вы используетеэта часть, и если какой-то индекс должен увеличиваться, убедитесь, что он находится внутри цикла и будет попадать один раз каждый раз, надеюсь, это поможет ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...