【问题标题】:How to copy an entire folder with current date/time in destination folder name?如何在目标文件夹名称中复制具有当前日期/时间的整个文件夹?
【发布时间】:2020-06-21 08:04:14
【问题描述】:

我尝试了很多搜索和解决方法,但我无法解决这个棘手的问题,因此请求帮助。几乎所有解决方案都在谈论文件重命名,但我正在寻找文件夹复制和重命名。 (我不是批处理或 cmd 专家。)

我有如下要求,我有两个目录:

来源:C:\temp\LR_Results\
目的地:C:\temp\HTML_Reports\

我在源目录C:\temp\LR_Results\ 中有一个名为HTML_Report 的文件夹,我想将其复制到目标目录C:\temp\HTML_Reports\

要求在从源 C:\temp\LR_Results\ 复制到目标 C:\temp\HTML_Reports\ 时,应将时间戳添加到文件夹名称 HTML_Report

所以生成的目录结构应该如下所示:

C:\temp\HTML_Reports\HTML_Report_dd_mm_yyyy_hhmmss

时间戳应该是当前日期/时间。

如何使用批处理文件完成此操作?

【问题讨论】:

  • move, copyren 同时使用文件和文件夹,所以我无法想象,你的问题是什么。您能否展示您尚未工作的代码并解释究竟是什么不能按预期工作?
  • 无法在编辑中添加该代码 :( 出现错误。实际上我确实尝试单独移动复制和 ren 命令,但不知道如何为其添加时间戳以及如何将它们全部添加进去一个 bat 文件。现在 @Mofi 已经提供了链接,我将尝试集成时间戳代码,看看它是如何从那里开始的
  • 感谢 @Mofi 的链接和 Stephan 的那些简单技巧,我实际上正在编写一个复杂的代码来完成所有工作。现在我有一个单独的 bat 文件来复制文件夹和另一个使用 Mofi 共享的链接中的代码用时间戳重命名文件夹

标签: batch-file cmd


【解决方案1】:

以下代码可用于以dd_MM_yyyy_hhmmss 格式获取当前日期和时间,而无需为用于运行批处理文件的帐户配置哪个国家/地区:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

if exist %SystemRoot%\System32\robocopy.exe for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do set "CurrentDateTime=%%K_%%J_%%I_%%L%%M%%N" & goto CopyDirectory
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDateTime=%%I"
set "CurrentDateTime=%CurrentDateTime:~6,2%_%CurrentDateTime:~4,2%_%CurrentDateTime:~0,4%_%CurrentDateTime:~8,6%"

:CopyDirectory
%SystemRoot%\System32\xcopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%CurrentDateTime%\" /C /E /H /I /K /Q /R /Y >nul
endlocal

代码使用 ROBOCOPY 来获取独立于可用的当前日期时间区域,这是 Windows Vista 和 Windows Server 2003 以及所有更高版本的 Windows 版本的默认情况。在默认情况下 ROBOCOPY 不可用的 Windows XP 上使用 WMIC 慢得多的解决方案。

有关用于获取当前日期和时间区域独立于 ROBOCOPYWMIC 的三个命令行的详细说明,请阅读我在 Time is set incorrectly after midnight 上的回答。

另请参阅我在single line with multiple commands using Windows batch file 上的回答以了解运算符& 的解释,该运算符用于在定义环境变量CurrentDateTime 后立即运行命令GOTO 作为处理第一行的结果ROBOCOPY 输出的日期和时间导致在处理下一行之前退出循环。

最好使用日期/时间格式yyyy-MM-dd_hhmmss,这是国际日期格式。它的一大优点是C:\temp\HTML_Reports 中名称为HTML_Reports_yyyy-MM-dd_hhmmss 的多个子目录按名称字母顺序显示,同时也按时间顺序显示。这确实有助于通过 HTML 报告更好地了解目录。

日期/时间格式yyyy-MM-dd_hhmmss所需的代码,尽可能不写在单个命令行上以最有效地执行:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

if exist %SystemRoot%\System32\robocopy.exe (
    for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do (
        %SystemRoot%\System32\robocopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS
        goto EndBatch
    )
)

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDateTime=%%I"
set "CurrentDateTime=%CurrentDateTime:~0,4%-%CurrentDateTime:~4,2%-%CurrentDateTime:~6,2%_%CurrentDateTime:~8,6%"
%SystemRoot%\System32\xcopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%CurrentDateTime%\" /C /E /H /I /K /Q /R /Y >nul

:EndBatch
endlocal

此批处理文件使用 ROBOCOPY 来获取与区域无关的当前日期和时间,并在可用时复制目录。否则 WMIC 用于获取与当前日期和时间无关的区域,而 XCOPY 用于复制目录。

整个任务可以用一个只包含一个命令行的批处理文件来完成:

@for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @%SystemRoot%\System32\robocopy.exe "C:\temp\LR_Results\HTML_Report" "C:\temp\HTML_Reports\HTML_Report_%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS & goto :EOF

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • robocopy /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
  • xcopy /?

【讨论】:

    【解决方案2】:

    我在下面分享日期格式化机制。这肯定会帮助您创建解决方案。

    set foldername=folder1
    echo %foldername%_%date:~-4,4%%date:~-7,2%%date:~-10,2%%time:~0,2%%time:~3,2%
    

    有关批处理脚本的进一步阅读,请参阅其文档或任何教程,例如 this

    【讨论】:

      【解决方案3】:

      所以对我有用的解决方案如下。

      是的,它只有带有当前日期时间戳的rename 命令。为了复制文件夹,我使用了 Team City Server 附带的 inbuild 命令行界面解决方案,然后我调用了 rename.bat 文件,这对我有用。

      以下是重命名代码:

      @echo off
      For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
      For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
      CD C:\temp\HTML_Results
      Rename HTML_Report HTML_Report_%mydate%_%mytime%
      

      绝对不是最有效的,但对我有用。

      【讨论】:

      • 你应该Rename "HTML_Report" "HTML_Report_%mydate%_%mytime%"%time% 将在上午 10 点之前有一个空格,这会导致没有引号的语法错误。 (另外我希望您的 %time% 是 24 小时格式。12 小时格式(上午/下午)可能会导致意外结果。
      • 在我的电脑上date /t 给了我21.06.2020。这是使用language independent method to get a date/time string 的好理由
      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2021-11-06
      相关资源
      最近更新 更多