如果有任何新文件,则排除父目录

时间:2019-03-29 19:54:56

标签: powershell

我的公司为正在处理的每个项目共享一个单独的文件夹,并且如果在过去六个月中未触摸其中任何一个文件夹或其子文件夹中的文件,我希望将它们移至存档位置。如果该文件夹中的任何一个文件或其任何子文件夹在过去六个月中已被修改,我想跳过整个父目录。我现在已经准备就绪,但是我当前的迭代只跳过单个文件,而且我不确定如何指定跳过整个父级。这是我当前的脚本:

$Date = (Get-Date).AddMonths(-6)
$Source = 'C:\Scripts\Source'
$Dest = 'C:\Scripts\Test Target'

Get-ChildItem $Source -File -Recurse | Where {$_.LastWriteTime -lt $Date} | ForEach {

    $actualSource = Split-Path $_.FullName
    $actualDest = Split-Path $_.FullName.Replace($source,$dest)

    robocopy $actualSource $actualDest $_.Name /SEC

}

使用测试目录时,我有一个文件夹C:\ Scripts \ Source \ Drivers。该脚本会像我希望的那样复制该Drivers文件夹,但是如果我在该Drivers文件夹中的任何位置放置了较新的文件,则希望跳过整个文件夹。目前,该文件夹以及该文件夹中六个月以上的所有内容仍在复制中,只是跳过了较新的单个文件。

请让我知道是否需要更多信息。

1 个答案:

答案 0 :(得分:0)

只需将您的副本和递归语句拉回一级。首先,您要遍历所有父文件夹。然后对每个父文件夹进行递归检查,看是否有修改过的文件(如果有),然后复制该文件夹:

$Date = (Get-Date).AddMonths(-6)
$Source = 'C:\Scripts\Source'
$Dest = 'C:\Scripts\Test Target'

$ParentFolders = Get-ChildItem $Source -Directory
Foreach($Folder in $ParentFolders){
  $NewFiles = Get-ChildItem $Folder -File -Recurse | Where {$_.LastWriteTime -lt $Date}
  if($NewFiles.Count -eq 0)
  {
    #Archive
    robocopy $Folder $Dest /SEC
  }
}