在使用 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
的文件夹结构?
答案 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