windows - ZIP og slet filer ældre end 7 dage ved hjælp af 7ZIP og CMD

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har omkring 20 000 filer i mappen, jeg vil zip og slette filer ældre end 7 dage. Jeg prøvede dette script, men det virker meget langsomt:


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-Zip7z.exe" a "C:ARCHIVE\_\%TDate\%.zip" \%\%i
 del /a /f \%\%i
) 


Vær venlig at rådgive, hvordan du får det til at fungere hurtigere.

Bedste reference




Udover brugen af ​​forfiles, som er meget langsom (men uundgåelig for dette script, tror jeg), er den vigtigste decelerating del af dit script ændringen af ​​arkivet i hver enkelt loop iteration. I stedet skal du kun arkivere en gang, måske ved at bruge en listefil, så lad arkiveringsværktøjet slette filer, som den med succes komprimerede alene:


@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-Zip7z.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