Robocopy Maxage Minage с параметром Mir

Я использую Robocopy от источника до места назначения.

Следующее переместит все файлы.

Step 1: robocopy c:\Source C:\Destination /MIR

Теперь, когда я выполняю вторую команду на шаге, все, что до 1 января 2019 г., должно быть удалено из пункта назначения с параметром / MIR, однако этого не происходит (файлы после января 2019 г. по-прежнему остаются в папке, а не удаляются с помощью команды / MIR). Как мне решить эту проблему? Удалить что-нибудь до 20190101?

Step 2: robocopy c:\Source C:\Destination /MIR /maxage:19000101 /minage:20190101" 

person Community    schedule 03.06.2019    source источник
comment
так ... что происходит? [ухмылка] ///// ваши параметры означают исключить все, что старше MAXAGE и исключить все, что новее MINAGE. это, кажется, означает, что вы не зеркалируете любой файл, который находится в диапазоне 1900-01-01...2019-01-01. у вас есть такие файлы? НИЧЕГО зеркалируется?   -  person Lee_Dailey    schedule 04.06.2019
comment
да, у меня есть файлы до 2019 года и после 2019 года, однако, когда я запускаю шаг 2, файлы после 2019 года должны быть удалены   -  person    schedule 04.06.2019
comment
я не думаю, что это не то, что делает /mir. Шаг 2 предназначен только для файлов ДО 2019 и ПОСЛЕ 1900 ... и НЕ перемещает их, а просто копирует их.   -  person Lee_Dailey    schedule 04.06.2019
comment
StackOverflow предназначен для вопросов по программному коду if/else/endif разнообразия. Этот вопрос больше подходит для superuser.com. Пожалуйста, прочтите Справку по теме, прежде чем размещать здесь дополнительные вопросы. Удачи.   -  person shellter    schedule 04.06.2019


Ответы (1)


Это действительно кажется странным поведением, поскольку можно было бы подумать, что вы пытаетесь использовать переключатель /MINAGE для выбора всего, что младше 1 января 2019 г. Затем объедините его с переключателем /MIR или, точнее, переключателем /PURGE /E, чтобы удалить лишние файлы и каталоги, созданные после 1 января 2019 г.

Причина того, что это не работает, заключается в том, что переключатель /MINAGE влияет только на файлы, которые выбраны для копирования, даже если команда /MIR работает должным образом.

Скажем, у нас есть 2 файла, 1 старше 1 января 2019 г. и один новее.

C:\Source         C:\Destination
 File-2018.txt     
 File-2019.txt     

Когда мы запускаем стандартную команду \MIR:

Robocopy.exe C:\Source C:\Destination /MIR 

Оба файла будут скопированы должным образом.

2 files Copied

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

Если мы добавим дополнительный файл в место назначения:

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt

И повторно запустите команду /MIR:

Robocopy.exe C:\Source C:\Destination /MIR 

Получаем, как и положено, лишний файл удаляется:

2 files Skipped
1 files Extras

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

К команде \MIR, когда мы затем добавляем параметр /MINAGE, думая, что мы просим, ​​чтобы все 1 января 2019 года и старше оставалось, а остальное оставалось:

Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101

Получаем неожиданное:

2 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

Чтобы лучше проиллюстрировать, что происходит и почему файлы пропущены, давайте добавим еще один параметр, Include Skipped \IS:

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101

Мы получаем:

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

Это означает, что параметр \MINAGE отфильтровал только то, что мы хотели скопировать. Если мы сбросим, ​​очистим каталог и повторно запустим его, мы сможем лучше увидеть, что произошло:

Remove-Item C:\Destination -Force

C:\Source         C:\Destination
 File-2018.txt      
 File-2019.txt      

Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101

Мы получаем:

1 files Copied
1 files Skipped

C:\Source         C:\Destination
 File-2018.txt      File-2018.txt
 File-2019.txt      

Он скопировал старый файл, а не новый. Это означает, что при итерации файлов в источнике он использовал параметр /MINAGE, чтобы выяснить только какие файлы мне нужно скопировать, а не какие файлы мне нужно < strong> Удалить.

Причина такого поведения в том, что /MINAGE и соответствующие параметры /MAXAGE предназначены для очень больших каталогов с медленными сетевыми ссылками или меньшими конечными компьютерами, где нас обычно интересует только копирование определенных наборов файлов (например, только новые файлы со вчерашнего дня), и не обязательно копировать все файлы. Чаще всего в этих случаях зеркальное отображение обычно не выполняется или не требуется, поскольку набор файлов обычно представляет собой дельта-файлы.

Чтобы выделить копирование вместо удаления, если зеркалируем каталоги, а затем мы добавляем 2 дополнительных файла, один более старый и один более новый в Место назначения:

C:\Source         C:\Destination
                    File-2017.txt
 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt
                    File-2020.txt

И снова запустите с включенным пропущенным /IS, чтобы мы могли видеть, что копируется:

Robocopy.exe C:\Source C:\Destination /MIR /IS /MINAGE:20190101

Получаем несколько удивительное:

1 files Copied
1 files Skipped
2 files Extras

C:\Source         C:\Destination

 File-2018.txt      File-2018.txt
 File-2019.txt      File-2019.txt

Это подчеркивает, что /MIR предназначен для ... ну ... зеркалирования. Остальные параметры нужны только для того, чтобы указать что для Копировать.

Начнем с исходных файлов, задействованных в копии:

C:\Source
 File-2018.txt
 File-2019.txt

Применяем фильтрацию по Включать пропущенные /IS и /MINAGE:

C:\Source
 File-2018.txt    <- 1 files Copied
 File-2019.txt    <- 1 files Skipped

Затем выполняется команда \MIR Mirror, которая удаляет все файлы из места назначения, которые не были включены в исходные файлы:

C:\Destination
 File-2017.txt    <- 2 files Extra
 File-2020.txt  

Независимо от возраста дополнительных файлов

Простое решение - просто не копировать все сначала. Начните с пустого каталога и копируйте только файлы младше 1 января 2019 г .:

Remove-Item C:\Destination -Force
Robocopy.exe C:\Source C:\Destination /E /MINAGE:20190101

Редактировать

Усовершенствованный метод (вместо того, чтобы сначала удалить весь каталог), вы просто запускаете скрипт очистки в месте назначения, чтобы сначала удалить элементы младше 1 января 2019 года из места назначения:

#Cleanup younger files
Get-ChildItem C:\Destination -Recurse | Where { $_.LastWriteTime -gt (Get-Date '2019-01-01')} | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

#Mirror over new files
Robocopy.exe C:\Source C:\Destination /MIR /MINAGE:20190101
person HAL9256    schedule 04.06.2019
comment
Черт! Я надеялся, что к тому времени, когда я дойду до конца этой дороги из желтого кирпича, найдется обходной путь или решение для комбинации /purge /e и /minage ... В конце концов, хорошее решение, но лично я пришел сюда, надеясь использовать это как метод очистки, если что-то не было удалено из каталога и ему исполнилось X дней, я помогу им и удалю это для них в соответствии с политикой. Увы, я все еще ищу решение. - person Arvo Bowen; 30.03.2021
comment
@ArvoBowen Я добавил дополнительное РЕДАКТИРОВАНИЕ к ответу для более оптимального решения. Я согласен, однострочный robocopy скрипт был бы предпочтительнее, но разбив его на 2 части очистки, а затем скрипт копирования - это, по сути, единственный способ использовать robocopy для этого. - person HAL9256; 01.04.2021