Use XCOPY with /D and /L options, "copying" from folder 1 to folder 2.
The /D option restricts the copy to only new or modified files.
The /L option causes the command to list the files that would be copied, but prevents any copies from actually being made.
Then use FOR /F to process those results and actually copy the files to folder 3.
for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul
If put in a batch file, then all
% must be doubled as
The XCOPY also prints out a summary of how many files are (would be) affected. The above will attempt to copy a file with the summary count "name", and of course fail. The redirection of output to nul prevents the error message from displaying. I tested on Windows 7 and was surprised the error message was on stdout and not stderr. If the error message on other versions is appearing on stderr, then the command should also get 2>nul to prevent the error message.
But there is a risk in hiding the error messages - what if a copy fails for some reason?
Here is a script that will list all files that were successfully copied, as well as indicate which (if any) failed. It uses FINDSTR to filter out the unwanted file count. It assumes the file count is in English, with the form
NNN File(s), so it would have to be modified for other languages.
for /f "eol=: delims=" %%F in (
'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"
Here is a more complex variant that works with any language. It saves each file name to a variable and delays the copy until the next loop iteration. The last entry (the count) never gets copied.
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
if defined file (
copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"