Как скопировать всю папку с текущей датой / временем в имени папки назначения? - PullRequest
0 голосов
/ 21 июня 2020

Я много пытался найти и обойти эту проблему, но не могу обойти эту неприятную проблему и, следовательно, обращаюсь за помощью. Практически все решения говорят о переименовании файлов, но я ищу копию и переименование папки. (Я не эксперт по пакетам или cmd.)

У меня есть требование, как показано ниже, где у меня есть два каталога:

Источник: C:\temp\LR_Results\ Место назначения: C:\temp\HTML_Reports\

У меня есть папка с именем HTML_Report внутри исходного каталога C:\temp\LR_Results\, которую я хочу скопировать в каталог назначения C:\temp\HTML_Reports\.

Требование состоит в том, что метка времени должна быть добавлена ​​к имени папки HTML_Report при копировании в место назначения C:\temp\HTML_Reports\ из источника C:\temp\LR_Results\.

Таким образом, результирующая структура каталогов должна выглядеть так:

C:\temp\HTML_Reports\HTML_Report_dd_mm_yyyy_hhmmss

Метка времени должна быть текущей датой / временем.

Как это можно сделать с помощью командного файла?

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Следующий код может использоваться для получения текущей даты и времени в формате 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. Гораздо более медленное решение с WMI C используется в Windows XP, на котором ROBOCOPY недоступен по умолчанию.

Подробное описание трех командные строки, используемые для получения текущей даты и временного региона независимо от ROBOCOPY или WMI C прочтите мой ответ на Время установлено неправильно после полуночи .

См. Также мой ответ на одну строку с несколькими командами с использованием Windows пакетного файла для объяснения оператора &, который используется для запуска команды GOTO сразу после определение переменной окружения CurrentDateTime в результате обработки вывода первой строки командой ROBOCOPY с датой и временем, что приводит к выходу из l oop перед обработкой следующей строки.

Это будет Намного лучше использовать как формат даты / времени 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 , чтобы получить независимую от региона текущую дату и время и скопировать каталог, если он доступен. В противном случае WMI C используется для получения текущей даты и времени независимо от региона, а XCOPY используется для копирования каталога.

Вся задача может быть выполнена с пакетный файл, содержащий только одну командную строку при несовместимости с Windows XP, должен быть принят во внимание и, предполагая, что необходимые расширения команд включены и не требуются, отложенное расширение переменной среды отключено по умолчанию:

@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

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки , выполните в нем следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • robocopy /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
  • xcopy /?
0 голосов
/ 21 июня 2020

Итак, решение, которое сработало для меня, выглядит следующим образом:

Да, в нем есть только команда rename с текущей меткой даты и времени. чтобы скопировать папку, я использовал решение интерфейса командной строки inbuild, которое поставляется с Team City Server, а затем я вызвал файл 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%

Определенно не самый эффективный, но у меня работает.

0 голосов
/ 21 июня 2020

Я использую механизм форматирования даты ниже. Это определенно поможет вам создать свое решение.

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

Для дальнейшего чтения по пакетным сценариям обратитесь к его документации или любому руководству, например this .

...