Powershell:从x天内创建的多个文件夹复制文件,同时保持文件夹结构

时间:2018-07-03 13:31:53

标签: powershell

在使用 FOREACH 循环在Powershell复制期间维护文件夹结构时,我遇到了问题,因为父文件夹下的某些文件夹需要创建的时间早于90天,而其他文件夹需要的数据要早于90天。

$Folders_90Days = "C:\Admin\Ripley","C:\Admin\Android","C:\Admin\Bishop"
$Folders_180Days = "C:\Admin\Archer","C:\Admin\Figgis","C:\Admin\Pam"
$Dest = 'D:\Archive_Target'

FOREACH($path in $Folders_90Days){
$files = (Get-ChildItem $path | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-90)})

ForEACH($file in $Files){
Copy-Item $file.FullName -destination $Dest -Recurse
}
#End ForEach Folders_90Days loop
}

运行副本时,将从源文件夹复制的数据直接复制到目标中。
因此,本质上Ripley中的数据直接复制到Archive_Target中。

如何将其复制,将源文件夹变成目标文件夹?
示例:
D:\Archive_Target\Ripley
 -是否一直保持Source Ripley的文件夹结构?

1 个答案:

答案 0 :(得分:0)

我创建了一个无需使用xcopy即可执行此操作的函数。

我将其放在允许并行处理的工作流程中。

使用正则表达式,我得到了作为源基础的文件夹。如果路径没有在那里创建,则实际的肉在管道中。 获取源中的所有项目,通过管道将其复制到AgeInDays之前的旧版本,然后复制该项目及其容器,以使文件结构保持相同。

workflow Copy-ItemBasedOnCreation{
    Param(
        [string[]]$Sources,
        [string]$Desination,
        [int]$AgeInDays
    )

    foreach –parallel ($Source in $Sources){
        $FixedDesination = "$($Desination)$($Source -replace '.*\\')"
        if(!(Test-Path -Path $FixedDesination)){
            md $FixedDesination
        }
        Get-ChildItem  $Source -Recurse | ?{(($_.CreationTime).Day -gt $AgeInDays)} | Copy-Item -Destination $FixedDesination -Recurse -Container
    }
}

Copy-ItemBasedOnCreation -Sources @("C:\Users\Default\Desktop\Source\TEST1","C:\Users\Default\Desktop\Source\TEST2") -Desination "C:\Users\Default\Desktop\Destination\" -AgeInDays 90
Copy-ItemBasedOnCreation -Sources @("C:\Users\Default\Desktop\Source\TEST4","C:\Users\Default\Desktop\Source\TEST5") -Desination "C:\Users\Default\Desktop\Destination\" -AgeInDays 180