1

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

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

SET DESTINATION=c:\temp\new
SET DATE_FROM=01/01/2019
SET DATE_TO=01/10/2019

> nul forfiles /S /D +%DATE_FROM% /C "cmd /C if @isdir==FALSE 2> nul forfiles /M @file /D -%DATE_TO% && > con ( echo @path && copy /V @path %DESTINATION% )"

pause

Этот пакетный скрипт копирует все файлы в указанном диапазоне дат в корень папки C:\temp\new но не копирует структуру исходной папки вместе с ней. Мне нужно, чтобы место назначения также содержало соответствующую структуру исходных папок для скопированных файлов в пределах определенного диапазона дат.

2 ответа2

1

Рекурсивное копирование файлов и структуры папок в диапазоне дат

Вы можете использовать PowerShell и Get-ChildItem для рекурсивного получения значений атрибутов LastWriteTime файлов в исходном каталоге.

Для исходных файлов, которые имеют значение атрибута LastWriteTime в диапазоне дат, вы можете заменить значение исходной папки значением папки назначения, а затем использовать Copy-Item с параметрами -Recurse -Force чтобы создать соответствующую структуру и скопировать поверх файлы.

Примечание: я написал это для вас как в логике пакетного сценария, так и в логике сценария PowerShell ниже.


партия

Важно: Просто установите самые верхние значения переменных (src= и dest=) для исходной и целевой папок, а также для значений даты до и от нужного диапазона (Date_From= и Date_To=) в формате MM/DD/YYYY как установлено в этих значениях в следующем примере скрипта.

SET "src=c:\source\original"
SET "dest=c:\temp\new"
SET "Date_From=01/01/2017"
SET "Date_To=02/26/2017"

CALL :PSScript "%src%" "%dest%" "%Date_From%" "%Date_To%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
EXIT

:PSScript
SET PSScript=%temp%\~tmp%~n0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"

ECHO $src       ^= "%~1";                                                                            >>"%PSScript%"
ECHO $dest      ^= "%~2";                                                                            >>"%PSScript%"
ECHO $Date_From ^= "%~3";                                                                            >>"%PSScript%"
ECHO $Date_To   ^= "%~4";                                                                            >>"%PSScript%" 

ECHO $Date_From ^=[datetime]$Date_From;                                                              >>"%PSScript%"
ECHO $Date_To   ^=[datetime]$Date_To;                                                                >>"%PSScript%"

ECHO $srcFiles ^= ^(Get-ChildItem -Path $src -Recurse^);                                             >>"%PSScript%"
ECHO $srcFiles ^| %% {If^(^($_.LastWriteTime -ge $Date_From^) -or ^($_.LastWriteTime -le $Date_To^)^)>>"%PSScript%"
ECHO                 {                                                                               >>"%PSScript%"
ECHO                     $dPath ^= ^($_.FullName.Replace^($src,$dest^)^);                            >>"%PSScript%"
ECHO                     Copy-Item $_.FullName -destination $dPath -Recurse -Force;                  >>"%PSScript%"
ECHO                 }                                                                               >>"%PSScript%"
ECHO               };                                                                                >>"%PSScript%"
GOTO :EOF

PowerShell

Важное замечание: Просто установите самые верхние значения переменных ($src= и $dest=) для исходной и целевой папок, а также для значений даты до и от нужного диапазона ($Date_From= и $Date_To=) в MM/DD/YYYY Формат ДД / ГГГГ , установленный в этих значениях в следующем примере скрипта.

$src  = "c:\source\original";
$dest = "c:\temp\new";
$Date_From = "01/01/2017";
$Date_To   = "02/26/2017";

$Date_From = [datetime]$Date_From;
$Date_To   = [datetime]$Date_To;

$srcFiles = (Get-ChildItem -Path $src -Recurse);
$srcFiles | % {If(($_.LastWriteTime -ge $Date_From) -or ($_.LastWriteTime -le $Date_To))
                {
                    $dPath = ($_.FullName.Replace($src,$dest));
                    Copy-Item $_.FullName -destination $dPath -Recurse -Force ; 
                }
              };

Дополнительные ресурсы

0
SET "DESTINATION=C:\temp\new"
SET "DATE_FROM=20190101"
SET "DATE_TO=20190110"
ROBOCOPY .\ "%DESTINATION%" /MAXAGE:%DATE_FROM% /MINAGE:%DATE_TO% /S /E

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .