#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 выдает странные ошибки о несуществующих файлах (они есть)