robocopy / mir не дублирует структуру папок

0

Я использую следующий скрипт для архивирования всего до 1 января 2013 года:

foreach  ($i in Get-ChildItem "O:\Projects” -Force -Recurse)
{
    if ($i.LastWriteTime -gt ($(Get-Date).AddDays(-649)))
    {
          robocopy $i.FullName "A:\Operations\Projects" /Z /S /MOVE /MIR
    }
}

проблема в том, что скрипт не копирует точное дерево каталогов. это только копирование папки, содержащей соответствующий файл, в корень целевого каталога.

В качестве примера это будет представлять нашу структуру папок:

  • Проект А
    • котировка
      • QuoteA.pdf (последнее изменение 6/2011)
    • закрытие
      • CloseoutA.pdf (последнее изменение 11/2011)
  • Проект Б
    • котировка
      • QuoteB.pdf (последнее изменение 10/2012)
    • закрытие
      • CloseoutB.pdf (последнее изменение 4/2013)

мой скрипт выше приведет к следующей целевой папке:

  • котировка
    • QuoteA.pdf
    • QuoteB.pdf
  • закрытие
    • CloseoutA.pdf

Приведенный выше пример чрезвычайно прост. Некоторые файлы имеют глубину 8 или 9 папок. в исходной директории около 30 000 папок. Мне нужен полный путь к соответствующему файлу, чтобы он остался нетронутым при перемещении. Как мне это сделать?

jchap1590
источник

Ответы:

0

Редактировать из комментариев ниже:

Вы можете попытаться разрешить robocopy решать, нужно ли перемещать файл в дереве, и избегать использования Get-Childitem:

robocopy "O:\Projects" "A:\Operations\Projects" /Z /S /MOVE /MIR /MINAGE:649
Микки Балладелли
источник
Я использовал $ i.FullName, но $ i.DirectoryName не помогло независимо. Он просто помещал все файлы в корень целевого каталога без подпапок. По какой-то причине он говорит «ОШИБКА 2 (0x00000002) Доступ к исходному каталогу». Для всех пользователей на целевом диске установлены полные разрешения, я не уверен, почему возникнет ошибка при доступе к исходному каталогу. Кроме того, я немного сбит с толку, если я должен использовать -gt или -lt для выбора объектов старше указанного времени.
jchap1590
Что касается даты, которую вы упомянули ($ i.LastWriteTime -gt ($ (Get-Date) .AddDays (-649)), это означает, что $ i.LastWriteTime более поздний, чем 649 дней назад. Если вы хотите старше, используйте - lt.
Микки Балладелли
Я думаю, что Get-ChildItem сбивает с толку Robocopy. Видите ли, сначала вы получаете дерево каталогов, затем запрашиваете Robocopy к / MIR и / MOVE этому дереву, затем Foreach делает доступ к следующему элементу в дереве, но он уже был перемещен предыдущей итерацией.
Микки Балладелли
Я попробую команду robocopy, не запуская ее через powershell, но я подумал, что прочитал, что нет способа сделать рекурсивную робокопию самой по себе, и, следовательно, причину выполнить через powershell.
jchap1590
команда, кажется, делает то, что я хочу! РЕДАКТИРОВАТЬ: не важно, я понял. Огромное спасибо!
jchap1590