如何首先复制文件夹中的最新/最新文件?

时间:2017-05-15 12:45:39

标签: windows batch-file

如何首先复制文件夹中的最新/最新文件?

例如,我的代码首先将最新的文件夹复制到远程机器上,这正是我想要做的。

但是如何在给定文件夹中首先传输最新文件?

setlocal
set "sourceDir=C:\AutoFrameworkResults"
set "destDir=\xxx.1xx.1.xx\c$\Common\AutoFrameworkResults"

for /f "delims=" %%d in ('dir "%sourceDir%" /o-d /ad /b') do (
    xcopy /y /s "%sourceDir%\%%d" "%destDir%\%%d\"
)

示例输出(顺序错误,应该颠倒):

C:\AutoFrameworkResults\15 May 2017\01.20.50\Time.01.20.57, Test1.jpeg
C:\AutoFrameworkResults\15 May 2017\01.20.50\Time.01.20.59, Test2.jpeg
C:\AutoFrameworkResults\15 May 2017\01.20.50\Time.01.21.14, Test3.jpeg
C:\AutoFrameworkResults\15 May 2017\01.20.50\Time.01.21.20, Test4.jpeg

1 个答案:

答案 0 :(得分:1)

首先,用于目标目录的UNC路径必须以两个反斜杠\\开头,只有一个反斜杠\

其次, DIR 命令选项/ad表示使用目录属性集列出指定目录中的任何条目,这就是为什么只有 DIR 并由 FOR 进一步处理。

那么需要复制指定目录中的最新文件是这样的:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:\AutoFrameworkResults\15 May 2017\01.20.50"
set "DestDir=\\xxx.1xx.1.xx\c$\Common\AutoFrameworkResults"

for /F "eol=| delims=" %%I in ('dir "%SourceDir%\*" /A-D /B /O-D 2^>nul') do (
    %SystemRoot%\System32\xcopy.exe "%SourceDir%\%%I" "%DestDir%\" /C /H /I /K /Q /R /Y >nul
    goto NewestFileCopied
)

:NewestFileCopied
endlocal

命令 DIR 输出目录属性设置的任何目录条目,因为/A-D表示任何文件。由于/B,输出应为裸格式,这意味着此处仅包含文件扩展名的文件名。由于/O-D(反向排列的日期)和隐式/TW(写入时间)是默认值,因此输出应该按照相反顺序的最后修改日期,因此不能明确指定。< / p>

如果在指定目录中找不到文件,则 DIR 输出的错误消息通过使用{将句柄 STDOUT 重定向到设备 NUL 来抑制{1}}。这里有必要使用插入字符2>nul来转义重定向操作符>,以便在解析 FOR 命令行时由Windows命令解释器解释为文字字符,但作为重定向操作符稍后 FOR 在后台单独的命令进程中执行 DIR 命令行。

复制最新文件后,使用 GOTO 命令退出循环。

但看起来这个文件复制任务的要求是批处理代码还需要找出2个目录级别中最新的子目录。在这种情况下,有必要再使用2个 FOR 循环。

^

如果通过使用子例程来确定当前目录中的最新目录,并且为每个找到的目录调用自身,这意味着在批处理中使用递归调用的子例程,目录级别的数量也是未知的。文件。

下面的批处理代码按最新到最旧文件的顺序复制最新目录中的所有文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:\AutoFrameworkResults"
set "DestDir=\\xxx.1xx.1.xx\c$\Common\AutoFrameworkResults"

for /F "eol=| delims=" %%A in ('dir "%SourceDir%\*" /AD /B /O-D 2^>nul') do (
    for /F "eol=| delims=" %%B in ('dir "%SourceDir%\%%A\*" /AD /B /O-D 2^>nul') do (
        for /F "eol=| delims=" %%C in ('dir "%SourceDir%\%%A\%%B\*" /A-D /B /O-D 2^>nul') do (
            %SystemRoot%\System32\xcopy.exe "%SourceDir%\%%A\%%B\%%C" "%DestDir%\%%A\%%B\" /C /H /I /K /Q /R /Y >nul
            goto NewestFileCopied
        )
    )
)

:NewestFileCopied
endlocal

但老实说,我真的不明白从最新目录复制所有文件时要求将文件从最新复制到最旧的要求。复制最新目录中的所有文件以使用此代码会更快:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:\AutoFrameworkResults"
set "DestDir=\\xxx.1xx.1.xx\c$\Common\AutoFrameworkResults"

for /F "eol=| delims=" %%A in ('dir "%SourceDir%\*" /AD /B /O-D 2^>nul') do (
    for /F "eol=| delims=" %%B in ('dir "%SourceDir%\%%A\*" /AD /B /O-D 2^>nul') do (
        for /F "eol=| delims=" %%C in ('dir "%SourceDir%\%%A\%%B\*" /A-D /B /O-D 2^>nul') do (
            %SystemRoot%\System32\xcopy.exe "%SourceDir%\%%A\%%B\%%C" "%DestDir%\%%A\%%B\" /C /H /I /K /Q /R /Y >nul
        )
        goto NewestFilesCopied
    )
)

:NewestFilesCopied
endlocal

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

  • @echo off setlocal EnableExtensions DisableDelayedExpansion set "SourceDir=C:\AutoFrameworkResults" set "DestDir=\\xxx.1xx.1.xx\c$\Common\AutoFrameworkResults" for /F "eol=| delims=" %%A in ('dir "%SourceDir%\*" /AD /B /O-D 2^>nul') do ( for /F "eol=| delims=" %%B in ('dir "%SourceDir%\%%A\*" /AD /B /O-D 2^>nul') do ( %SystemRoot%\System32\xcopy.exe "%SourceDir%\%%A\%%B\*" "%DestDir%\%%A\%%B\" /C /H /I /K /Q /R /Y >nul goto NewestFilesCopied ) ) :NewestFilesCopied endlocal
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using command redirection operators

的文章