Windows批处理脚本复制具有文件夹结构的文件

Windows批处理脚本复制具有文件夹结构的文件

我想将修改日期属性值在特定日期范围内的文件从一个文件夹复制到另一个文件夹。我可以使用以下脚本执行复制,但它只会复制源位置父目录中的根级文件

我需要复制符合日期范围要求的文件的整个文件夹结构。

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文件夹,但它不会复制源文件夹结构。我需要目标也包含定义的日期范围内复制文件的匹配源文件夹结构。

答案1

在日期范围内递归复制文件和文件夹结构

您可以使用 PowerShell 和获取子项LastWriteTime在起始源目录中递归获取文件的属性值。

对于属性值在日期范围内的源文件LastWriteTime,您可以将源文件夹值替换为目标文件夹值,然后使用复制项目使用-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

电源外壳

重要的:只需为源文件夹和目标文件夹设置最顶层的变量值($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 ; 
                }
              };

更多资源

答案2

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

相关内容