2013-07-22 3 views
4

На компьютере с Windows (победитель 7 или Win server 2008 R2) У меня есть пакетный скрипт, который копирует некоторые .config файлы в папку резервного копирования ,
Я хочу написать еще один скрипт, который удаляет файлы резервных копий, созданные за неделю до этого.Пакетный скрипт для удаления файлов старше X дней (на основе даты создания, не измененной даты)

Есть много предложений о том, как использовать FORFILES (в качестве примера):

FORFILES /P "D:\Configs_Backup" /M *.config /D -7 /C "cmd /c del @file" 

Но эта команда использует «модифицированную» метку времени, в то время как мне нужно использовать дату создания.

Не устанавливая какую-либо стороннюю программу, можно ли это сделать через консоль?

+0

Вы можете использовать 'DIR/TC', но может потребоваться синтаксический анализ даты. –

+1

Это может быть не самый лучший способ, но вы можете заставить исходный скрипт создать новый файл, чтобы «измененная дата» была новой. Я просто лично ненавижу делать какие-либо строковые разборки с пакетными файлами. – Gray

+0

@Gray: да, возможно, не оптимально, но на самом деле ваша идея - не плохая идея в моем контексте. +1 для подсказки. – Francesco

ответ

5

попробовать это, посмотрите на выходе и удалить echo, если она хорошо выглядит:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION 
SET /a XDay=7 
CALL :DateToJDN "%DATE%" JDNToday 
FOR /r "D:\Configs_Backup" %%a IN (*.config) DO (
    FOR /f "tokens=1,4*" %%b IN ('dir /tc "%%~a"^|findstr "^[0-9]"') DO (
     CALL :DateToJDN "%%b" filedate 
     SET /a diffdays=JDNToday-filedate 
     IF !diffdays! gtr %XDay% ECHO DEL /F /Q "%%~a" 
     ) 
    ) 
GOTO :eof 

:DateToJDN "DD mm/dd/yyyy" jdn= 
setlocal 
set date=%~1 
set /A yy=%date:~-4%, mm=1%date:~-10,2% %% 100, dd=1%date:~-7,2% %% 100 
set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075 
endlocal & set %2=%jdn% 
exit /B 

Примечание: это работает только для AM/PM формат времени.

+0

Я сделал несколько тестов, и он отлично работает. Мой местный формат времени имеет 24 часа (европейское время), а не формат AM/PM. Однако, отдавая старые и новые файлы, партия может выбирать только те, что были старше 7 дней. Вы говорили о чем-то другом? – Francesco

+0

для изменения формата времени '' tokens = 1,4 * "' to '" tokens = 1,3 * "'. Это работает здесь. – Endoro

+0

Если вы измените это 'IF! Diffdays! gtr% XDay% ', партия может также выбрать много других времен и диапазонов, пожалуйста, посмотрите на' if /? 'в командной строке. – Endoro

1

Посмотрите, если это поможет - Сохраните файлы с 5 * .config (skip = 5) с самой последней датой создания
Проверьте это на образцах файлов.

@echo off 
pushd "d:\folder" 
    del file2.tmp 2>nul 
    for /f "delims=" %%a in ('dir *.config /b /a-d ') do call :getcreationdate "%%~fa" 
    sort /r <file2.tmp >file.tmp 
    for /f "skip=5 tokens=1,*" %%a in (file.tmp) do del "%%~b" 
    del file.tmp file2.tmp 
popd 
pause 
goto :EOF 

:getcreationdate 
set "file=%~1" 
set "file=%file:\=\\%" 
WMIC DATAFILE WHERE name="%file%" get creationdate | find "." >file.tmp 
for /f %%b in (file.tmp) do set dt=%%b 
set dt=%dt:~0,8%_%dt:~8,6% 
del file.tmp 
>>file2.tmp echo %dt% "%~1" 
+0

Даже этот подход кажется довольно хорошим, спасибо! – Francesco

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