如何在运行XCOPY时识别目标文件夹中的更新文件?

时间:2017-10-02 04:30:06

标签: windows batch-file

我创建了一个批处理文件,用于将更新的文件从源文件夹同步到目标文件夹。它工作得很好。现在,我想在每次运行脚本时识别(或复制到文件夹)目标文件夹中的更新文件,以便它可以用于某些操作。

有没有办法实现这个目标?

xcopy.bat

xcopy E:\sss q:  /c /d /e /h /i /k /q /r /s /y

2 个答案:

答案 0 :(得分:0)

删除目标目录Q:\,在运行 XCOPY 命令之前,从所有目录中的所有文件中递归存档属性。然后运行 XCOPY ,将所有较新的文件复制到Q:\。上次处理目标目录中设置了归档属性的所有文件,这些文件是由 XCOPY 复制的文件。

示例批处理文件只是在复制较新文件后打印到控制台窗口中设置了存档属性的文件:

@echo off
%SystemRoot%\System32\attrib.exe -A Q:\* /S
%SystemRoot%\System32\xcopy.exe E:\sss Q:\ /C /D /E /H /I /K /Q /R /S /Y >nul
for /F "delims=" %%I in ('dir Q:\* /AA-D /B /S 2^>nul') do echo %%I

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • attrib /?
  • dir /?
  • echo /?
  • for /?
  • xcopy /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章

答案 1 :(得分:0)

要列出实际已复制的所有文件,您可以用/Q替换开关/F(不显示文件名)(显示完整的源文件名和目标文件名)并从中提取目标路径输出,如下例所示(参见所有解释性注释):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=E:\sss" & rem // (path to source directory)
set "_TARGET=Q:\\"   & rem // (path to destination directory)

rem /* Run `xcopy` to do its job (remove `/L` to actually copy files); the `/F` option
rem    lets `xcopy` output the full source and destination paths of each file copied,
rem    separated from each other by ` -> `; hence split each line at this separator to
rem    extract the destination path; `find` filters out the final summary line (like
rem    `?? File(s)`); `for /F` finally captures the output of `xcopy`: */
for /F "delims=" %%F in ('
    xcopy "%_SOURCE%" "%_TARGET%" /C /D /E /H /I /K /F /R /Y /L ^| find ">"
') do (
    rem // Store current line (source and destination paths) in variable:
    set "FILE=%%F"
    rem // Toggle delayed expansion to avoid trouble with exclamation marks:
    setlocal EnableDelayedExpansion
    rem // Split current line at said separator to retrieve the destination path:
    set "FILE=!FILE:* -> =!"
    rem // Return the extracted destination path:
    echo/!FILE!
    endlocal
)

endlocal
exit /B

不要忘记从/L删除xcopy(要复制的列表文件)选项以实际复制任何文件。

如果您希望将文件列表写入文本文件(例如批处理文件目录中的filelist.txt),请使用以下代码(这次省略大多数注释):< / p>

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=E:\sss" & rem // (path to source directory)
set "_TARGET=Q:\\"   & rem // (path to destination directory)
set "_LISTFILE=%~dp0filelist.txt" & rem // (path to list file)

rem // Redirect output of whole `for /F` loop to a text file:
> "%_LISTFILE%" (
    for /F "delims=" %%F in ('
        xcopy "%_SOURCE%" "%_TARGET%" /C /D /E /H /I /K /F /R /Y /L ^| find ">"
    ') do (
        set "FILE=%%F"
        setlocal EnableDelayedExpansion
        set "FILE=!FILE:* -> =!"
        echo/!FILE!
        endlocal
    )
)

endlocal
exit /B