Исключение родительского каталога, если какой-либо файл является новым

#powershell

#powershell

Вопрос:

У моей компании есть отдельные папки в общей папке для каждого проекта, над которым они работают, и если за последние шесть месяцев ни один файл внутри одной из этих папок или ее подпапок не был затронут, я хочу переместить их в архивное расположение. Если какой-либо файл в папке или любая из ее вложенных папок были изменены за последние шесть месяцев, я хочу пропустить весь родительский каталог. Сейчас я проделал большую часть пути, но моя текущая итерация пропускает только отдельные файлы, и я не уверен, как указать пропуск всего родительского файла. Вот мой текущий скрипт:

 $Date = (Get-Date).AddMonths(-6)
$Source = 'C:ScriptsSource'
$Dest = 'C:ScriptsTest 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:ScriptsSourceDrivers. Скрипт копирует эту папку с драйверами так, как я хочу, но если я помещу более новый файл в любое место в этой папке с драйверами, я хочу, чтобы вся папка была пропущена. В настоящее время папка и все, что находится в папке старше шести месяцев, все еще копируются, и при этом просто пропускаются отдельные файлы, которые новее.

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Комментарии:

1. Почему вы не используете какую-либо форму решения для архивирования вместо того, чтобы решать это самостоятельно в powershell?

2. Есть ли какое-либо программное обеспечение, которое вы бы порекомендовали, которое могло бы делать все, что мне нужно? У меня не слишком большой опыт работы с программными решениями для архивирования, особенно с теми, которые требуют детального управления, такого как то, что я пытаюсь выполнить с помощью этого скрипта.

Ответ №1:

Просто верните свою инструкцию copy и recurse на один уровень выше. Сначала вы хотите выполнить итерацию по всем родительским папкам. Затем для каждой родительской папки выполните повторную проверку и проверьте, есть ли какие-либо измененные файлы, если есть, то скопируйте папку:

 $Date = (Get-Date).AddMonths(-6)
$Source = 'C:ScriptsSource'
$Dest = 'C:ScriptsTest 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
  }
}
  

Комментарии:

1. Похоже, это приближает меня, но это захватывает папки на один уровень ниже, чем хотелось бы. На самом деле я хотел бы переместить родительские каталоги и все, что в них. Если я попытаюсь изменить переменную $Folder в инструкции if на $ParentFolders, похоже, она тоже не хочет работать. Пока происходит одна из трех вещей, в зависимости от небольших настроек, таких как изменение на $ParentFolders: 1. Скрипт выполняется без ошибок, но ничего не делает 2. Скрипт запускается и копирует некоторые файлы в подкаталоги, но не в правильные родительские каталоги 3. Robocopy выдает странные ошибки о несуществующих файлах (они есть)