Search code examples
batch-file7zip

Forfiles with 7z zip ONLY last modified file


I am trying to zip only last modified file from a folder to help my workflow with bat file

but its giving an error

ERROR: No files found with the specified search criteria.

Here is my complete code

@ECHO ON
SET "SourceDir=C:\Users\user1\Documents\Work"
SET "ZipName=testing.zip"
SET "DestDir=C:\Users\user1\Documents\Work\result"
SET "now=%date:~4%"

CD /D "%DestDir%"

FORFILES /D %now% /m *.csv /c "cmd /c 7z.exe a -aoa -tzip %ZipName% %SourceDir% "

I am pretty sure there is file last modified today. I assume its didn't recognise the sourcedir? Am I missing in the quote?


Solution

  • I suggest not using command FORFILES, but use instead the commands FOR and DIR.

    @echo off
    set "SourceDir=%USERPROFILE%\Documents\Work"
    set "ZipName=testing.zip"
    set "DestDir=%USERPROFILE%\Documents\Work\result"
    
    for /F "delims=" %%I in ('dir "%SourceDir%\*" /A-D /B /O-D 2^>nul') do 7z.exe a -aoa -tzip "%DestDir%\%ZipName%" "%SourceDir%\%%I" & goto Done
    
    :Done
    

    DIR searches in specified source directory with wildcard pattern * because of /A-D (attribute not directory) only for files and outputs them because of /B (bare format) with file name only ordered by last modification date in reverse order because of /O-D which means newest file is output first.

    FOR process this output by DIR line by line. For the first line 7z.exe is called to compress the file into the ZIP archive file.

    Then goto :Done is executed to exit the FOR loop as all other files found and output by DIR are of no interest.

    I suggest to specify 7z.exe with full path in the batch file.

    2^>nul redirects the error message output by DIR if no file is found in source directory to device NUL to suppress it. The redirection operator > must be escaped here with caret character ^ to be interpreted as literal character on Windows command interpreter parses the entire FOR command line. The escape character ^ is already removed later on execution of DIR command line in a separate command process opened by FOR in background.

    Another version processing only files with archive attribute set and clear the archive attribute for each file compressed into the ZIP archive file.

    @echo off
    set "SourceDir=%USERPROFILE%\Documents\Work"
    set "ZipName=testing.zip"
    set "DestDir=%USERPROFILE%\Documents\Work\result"
    
    for /F "delims=" %%I in ('dir "%SourceDir%\*" /AA-D /B 2^>nul') do (
        7z.exe a -aoa -tzip "%DestDir%\%ZipName%" "%SourceDir%\%%I"
        %SystemRoot%\System32\attrib.exe -a "%SourceDir%\%%I"
    )
    

    For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.

    • attrib /?
    • dir /?
    • echo /?
    • for /?
    • goto /?
    • set /?

    Read also the Microsoft article about Using Command Redirection Operators.