2013-11-25 3 views
0

У меня есть пакет окон, чтобы упорядочить файлы более чем на 3 месяца в какой-то директории, однако есть некоторые проблемы: Loop_Folder_Del_Old_Files. Я не знаю, почему я не могу назначить последнюю измененную дату файлов, пожалуйста, помогите выяснить проблему. Ниже приведены исходный код и результат программы, спасибо!Windows Bat Del старые файлы

Исходный код

:program_start 
@ECHO ON 
echo program_start 

:Parameter_Settings 
set filePath=c:\New Folder 
set delPeriod=3 
echo %date% 
set curYYYY=%date:~10,4% 
set curMM=%date:~7,2% 
set curDD=%date:~4,2% 

:Set_The_Date_Of_3_Months_Ago 
set /A curMM=curMM - %delPeriod% 
if "%curMM%" LEQ "0" (
        set /A curMM="(curMM + 12 - %delPeriod%)%%12" 
        
if %curMM% == 0 (set curMM=12) ELSE (set curMM=%curMM%) 
        set /A curYYYY=curYYYY - 1 
) 
set curMM=00%curMM% 
set curMM=%curMM:~-2% 

set curDate=%curYYYY%%curMM%%curDD% 

:Loop_Folder_Del_Old_Files 
for %%a IN ("%filePath%\*.*") DO (
        set ltdate=%%~ta 
        set fileDate=%ltdate:~6,4%%ltdate:~3,2%%ltdate:~0,2% 
        if "%fileDate%" LSS "%curDate%" Del /Q "%%a" 
) 
:end 
echo program end 
pause 

Результат

C: \ > эхо program_start
program_start

C: \ > набор Filepath = C: \ Новая папка

C: \ > множество delPeriod = 3

C: \ > эхо Пт 22/11/2013
Пт 22/11/2013

C: \ > набор curYYYY = 2013

C: \ > множества curMM = 11

C: \ > множество curDD = 22

C: \ > множества/А curMM = curMM - 3

C: \ > если LEQ (
множество/А curMM = " (curMM + 12 - 3)% 12 "
если 8 == 0 (установить curMM = 12)     ИНАЧЕ (набор curMM = 8)
комплект/A curYYYY = curYYYY - 1
)

C: \ > множество curMM = 008

C: \ > множества curMM = 08

C: \ > множества CurDate = 20130822

C: \ > для% в IN (" C: \ Новая папка *.* ") DO (
множество ltdate =% ~ та
множество FILEDATE = ~ 6,4% ltdate: ~ 3,2% ltdate: ~ 0,2
если " " LSS Дель/Q "% "
)

C: \ > (
множества ltdate = 22/11/2013 г. 5:36 вечера
множество FILEDATE = ~ 6,4% ltdate: ~ 3,2% ltdate: ~ 0, 2
если " " ЛСС Дель/Q " C: \ Новая папка \ новый текстовый документ (2) .txt "
)

C: \ > (
множество ltdate = 22/11/2013 05:36 PM
набор FILEDATE = ~ 6,4% ltdate: ~ 3,2% ltdate: ~ 0,2
если " " LSS Del/Q " C: \ Новая папка \ New Text document.txt "
)

C: \ > эхо конца программы
конец программы

C: \ > паузы
Нажмите любую клавишу для продолжения. , ,

+0

Можем ли мы использовать PowerShell? Это было бы, ИМХО, легче писать и проще поддерживать в PowerShell. Современные системы Windows уже поставляются с PowerShell. – chwarr

+0

Чтобы форматировать код, просто снимите код и нажмите '{}' – Magoo

+0

Откуда появился HTML? – foxidrive

ответ

0

Необходимо, чтобы включил задержанное расширение, чтобы ваши переменные работали внутри цикла for.

Добавить

setlocal enabledelayedexpansion 

в верхней части файла битой

, а затем обратитесь к переменной, используя !var! синтаксис (вместо %var%)

if "!fileDate!" LSS "!curDate!" Del /Q "%%a" 
+0

@MC ND Спасибо за ваш комментарий, однако он не работает и отображается ниже результата после использования вашей рекомендации: C: \> ( set ltdate = 25/11/2013 05:00 PM set fileDate = ~ 6,4% ltdate: ~ 3,2% ltdate: ~ 0,2 если "! fileDate!" LSS "! curDate!" Del/Q "c: \ New Folder \ New Text Document.txt" ) –

+0

@ user3030364: Возможно, вы ссылаетесь на ответ @PA. В любом случае, если, как сказано, вы добавили 'setlocal enabledelayedexpansion' в начале вашего кода, то, что вы еще не сделали, это изменить синтакс внутри цикла for. Он должен быть 'set fileDate =! Ltdate: ~ 6,4 !! ltdate: ~ 3,2! Ltdate: ~ 0,2!', No '%', использовать '!' Для использования отложенного расширения и получить правильное значение переменной внутри цикла for. –

0

Дальше PA,

set /A curMM=curMM - %delPeriod% 
if "%curMM%" LEQ "0" (
     set /A curMM="(curMM + 12 - %delPeriod%)%%12" 
     if %curMM% == 0 (set curMM=12) ELSE (set curMM=%curMM%) 
     set /A curYYYY=curYYYY - 1 
) 

ненадежен, как currMM может быть 08 или 09, который будет генерировать синтаксическую ошибку как партия предполагает, что любое числовые Отправной с 0 является OCTAL.

set /A curMM=1%curMM% - 100 - %delPeriod% 
if %curMM% LEQ 0 (
     set /A curMM=curMM + 12 
     set /A curYYYY=curYYYY - 1 
) 

лучше. Сравнение выполняется против значения NUMERIC, а не строкового значения. Значение curMM будет 0 для Dec, -1 для Nov и т. Д. - поэтому простое добавление 12 и вычитание 1 из года является достаточным и ясным.

+0

HAHA, мой метод расчета месяца очень глупый ..... очень спасибо за совет –

1

Возможно, использование forfiles для удаления старых файлов может быть лучше в ручке?

+0

спасибо за ваше предложение, оно полезно использовать. –

Смежные вопросы