如何将过去 20 天内更改的文件递归复制到其他位置

如何将过去 20 天内更改的文件递归复制到其他位置

我在这里(在这个网站上)找到一个代码,它允许复制过去 20 天内更改的文件。我的问题是,我有一个包含许多子文件夹的文件夹,一些子文件夹可能有 8 级或更多层级。我需要将更改的文件复制到目标文件夹并维护文件夹结构。如何更改它以允许递归复制文件并维护相同的文件夹结构。以下是代码:

$DestinationFolder = "c:\temp1\"
$EarliestModifiedTime = (Get-date).AddDays(-20)
$Files = Get-ChildItem "c:\temp\*.*" 
foreach ($File in $Files) {
    if ($File.LastWriteTime -gt $EarliestModifiedTime)
    {
        Copy-Item $File -Destination $DestinationFolder
        Write-Host "Copying $File"
    }
    else 
    {
        Write-Host "Not copying $File"
    }
}

答案1

我认为这应该可以满足您的需求。利用Get-ChildItem -Recurse并保留以下文件夹结构$RelativePath

$SourceFolder = "c:\temp\"
$DestinationFolder = "c:\temp1\"
$EarliestModifiedTime = (Get-Date).AddDays(-20)
$Files = Get-ChildItem $SourceFolder -Recurse -File

foreach ($File in $Files) {
    if ($File.LastWriteTime -gt $EarliestModifiedTime) {
        $RelativePath = $File.FullName.Substring($SourceFolder.Length)
        $DestinationPath = Join-Path $DestinationFolder $RelativePath

        if (!(Test-Path -Path (Split-Path $DestinationPath))) {
            New-Item -ItemType Directory -Path (Split-Path $DestinationPath) -Force
        }

        Copy-Item $File.FullName -Destination $DestinationPath -Force
        Write-Host "Copying $File"
    }
    else {
        Write-Host "Not copying $File"
    }
}

但是正如@harrymc 所说,如果您可以使用robocopy或类似的东西,它可能会简单得多。

你可以试试:

robocopy /S /maxage:20 "c:\temp" "c:\temp1"

答案2

当 Windows 中存在更好的工具时,不要尝试自己构建工具。

看看 机器人复制 Windows 自带的工具,它有很多选项和操作模式。

还有很多免费的第三方工具可以在 Robocopy 替代方案页面

相关内容