Copy folders and store them in text file to exclude once copied folders on next run

后端 未结 2 1481
-上瘾入骨i
-上瘾入骨i 2021-01-15 17:53

I try to write a script that can monitor a folder H:\\Start and copy a new subfolder with its files in H:\\Start to new location H:\\Target

相关标签:
2条回答
  • 2021-01-15 18:36

    I suggest using:

    %SystemRoot%\System32\xcopy.exe H:\Start H:\Target /C /H /I /K /M /Q /R /S /Y >nul
    

    For information about all those parameters of xcopy open a command prompt window and run there xcopy /? to get help of this command displayed which explains all those parameters.

    The important one is /M which selects for copying process just files with archive attribute set and which removes the archive attribute on each file in H:\Start after copying the file. This avoids that a once copied file is copied once more as long as not modified in H:\Start since last copy.

    If you want to log all copied files into a text file, I suggest using:

    %SystemRoot%\System32\xcopy.exe H:\Start H:\Target /C /F /H /I /K /M /R /S /Y >>C:\Desktop\list.txt
    

    The names of the copied files are with this command line appended to text file C:\Desktop\list.txt


    The following commented batch code works with directory lists as asked for.

    @echo off
    rem Define source and destination directory as well as
    rem the names of the used list files each with full path.
    setlocal EnableExtensions
    set "Source=H:\Start"
    set "Destination=H:\Target"
    set "MainDirList=C:\Desktop\list.txt"
    set "CurrentList=%Temp%\CurrentList.tmp"
    set "ExcludeList=%Temp%\ExcludeList.tmp"
    set "FinalDoList=%Temp%\FinalDoList.tmp"
    
    rem Write the names of all subdirectories found in source
    rem directory into a list file in directory for temporary files.
    dir /AD /B "%Source%">"%CurrentList%"
    
    rem Check if list file is not empty because of no subdirectories.
    call :CheckEmpty "%CurrentList%"
    if %FileIsEmpty% == 1 (
        echo No directories in %Source%
        goto EndBatch
    )
    
    rem Start copying the directories if there is no main list file
    rem from a previous execution of this batch file or the main list
    rem file was deleted intentionally to force copying all again.
    if not exist "%MainDirList%" goto CopyDirectories
    
    rem Start copying also if main list file is an empty file.
    call :CheckEmpty "%MainDirList%"
    if %FileIsEmpty% == 1 del "%MainDirList%" & goto CopyDirectories
    
    rem Search in main list for lines matching completely lines in current
    rem list with ignoring case and write the found lines into an exclude
    rem list file as those directories were copied already before.
    %SystemRoot%\System32\findstr.exe /I /L /X /G:"%CurrentList%" "%MainDirList%" >"%ExcludeList%"
    
    rem Copy all directories if no line in current list is found in main list.
    if errorlevel 1 goto CopyDirectories
    
    rem Get all lines from current list not listed also in exclude list.
    %SystemRoot%\System32\findstr.exe /B /I /L /V /G:"%ExcludeList%" "%CurrentList%" >"%FinalDoList%"
    
    rem Replace the current list with the reduced final list.
    move /Y "%FinalDoList%" "%CurrentList%"
    
    rem Check if remaining current list is not empty because
    rem all subdirectories copied already before.
    call :CheckEmpty "%CurrentList%"
    if %FileIsEmpty% == 1 (
        echo Copied already before all directories in %Source%
        goto EndBatch
    )
    
    :CopyDirectories
    rem Copy each directory in remaining current list file.
    for /F "usebackq delims=" %%D in ("%CurrentList%") do (
        echo Coping %Source%\%%D
        %SystemRoot%\System32\xcopy.exe "%Source%\%%D" "%Destination%\%%D" /C /H /I /K /Q /R /S /Y >nul
    )
    
    rem Append the list of copied directories to main list file.
    type "%CurrentList%">>"%MainDirList%"
    goto EndBatch
    
    :CheckEmpty
    rem This little subroutine just checks if size of a list file is 0.
    if %~z1 == 0 ( set "FileIsEmpty=1" ) else ( set "FileIsEmpty=0" )
    goto:EOF
    
    :EndBatch
    rem Delete all not further needed listed files and environment variables.
    del "%ExcludeList%" 2>nul
    del "%CurrentList%"
    endlocal
    

    This batch file should work for the FTP folder mounted as drive on Windows. It does not depend on attributes or timestamps. It uses explicitly only the names of the directories in H:\Start. It also does not check which directories exist already in H:\Target. Therefore it is possible to delete a directory in H:\Target if not interested in and the deleted directory will be nevertheless not copied once again from H:\Start as long as the deleted directory is not also removed from main list file.

    For details on parameters used on findstr run in a command prompt window findstr /? and read the entire help output into the window.

    Thanks for this question as this was really an interesting batch coding task.

    0 讨论(0)
  • 2021-01-15 18:40

    You don't need to store anything, you can use

    xcopy /d /s h:\start h:\target
    

    /D:mm-dd-yyyy
    Copy files changed on or after the specified date. If no date is given, copy only files whose source date/time is newer than the destination time.

    but if you need a list of the files you can just use a redirection :

    xcopy /d /s h:\start h:\target > logfile.txt
    
    0 讨论(0)
提交回复
热议问题