2017-04-18 1 views
0

J'ai environ 20 000 fichiers dans le dossier, je veux compresser et supprimer des fichiers de plus de 7 jours. J'ai essayé ce script, mais il fonctionne très lentement:ZIP et supprimer les fichiers de plus de 7 jours en utilisant 7ZIP et CMD

Set TDate=%date:~6,4%%date:~3,2%%date:~0,2% 

for /f "delims=" %%i in (' 
forfiles /p C:\ARCHIVE /s /m *.txt /d -7 /c "cmd /c echo @path" 
') do (
"%ProgramFiles%\7-Zip\7z.exe" a "C:\ARCHIVE_%TDate%.zip" %%i 
del /a /f %%i 
) 

Veuillez nous indiquer comment accélérer le fonctionnement.

+3

Cette question appartient au (https [Code Review]: // codereview.stackexchange.com/) site. – aschipfl

Répondre

2

Outre l'utilisation de forfiles qui est très lent (mais inévitable pour ce script, je pense), la partie principale décélérer de votre script est la modification de l'archive dans chaque itération de boucle unique. Au lieu de cela, vous devez faire l'archivage une seule fois, en utilisant peut-être un fichier de liste, puis laissez l'outil d'archivage supprimer des fichiers, il compressé avec succès sur son propre:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=C:\ARCHIVE" 
set "_PATTERN=*.txt" 
set "_LIST=%TEMP%\%~n0.tmp" 
set "_ARCHIVER=%ProgramFiles%\7-Zip\7z.exe" 

rem // Get current date in locale-independent format: 
for /F "tokens=2 delims==" %%D in ('wmic OS get LocalDateTime /VALUE') do set "TDATE=%%D" 
set "TDATE=%TDATE:~,8%" 

rem // Create a list file containing all files to move to the archive: 
> "%_LIST%" (
    for /F "delims=" %%F in (' 
     forfiles /S /P "%_ROOT%" /M "%_PATTERN%" /D -7 /C "cmd /C echo @path" 
    ') do echo(%%~F 
) && (
    rem // Archive all listed files at once and delete the processed files finally: 
    "%_ARCHIVER%" a -sdel "%_ROOT%_%TDATE%.zip" @"%_LIST%" 
    rem // Delete the list file: 
    del "%_LIST%" 
) 

endlocal 
exit /B 
+0

Merci, ça marche beaucoup plus vite (2 minutes au lieu de 7 heures) –