Скрипт для перемещения папок и файлов с помощью minage

Я использую robocopy для удаления папок / файлов из каталога.

Сценарий:

  SET source1=c:\source
  SET destination=F:\destination
  SET switch1=/r:10 /w:1 /e /create /minage:10 /mt /LOG:F:\logs\backup.log

  FOR /d %%i IN ("%source1%\*") DO ROBOCOPY "%%i" "%destination%\%%~nxi" %switch1%
  FOR /d %%p IN ("%source1%\*") DO RMDIR "%%p" /s /q
  FOR /d %%q IN ("%destination%\*") DO RMDIR "%%q" /s /q

Исходный каталог выглядит так:

c: \ source \ directory \ file1.txt (12 дней назад)

c: \ source \ directory2 \ file2.txt (5 дней назад)

Моя проблема в этой строке в скрипте:

FOR /d %%p IN ("%source1%\*") DO RMDIR "%%p" /s /q

Эта строка - это не просто RMDIR, каталог, который был скопирован из источника, он удаляет их все. И примечание, я не могу использовать / move, так как он удалит исходный каталог. Если я использую / mov, он не удалит все подкаталоги.

Есть мысли, что я здесь не так? Заранее спасибо.

РЕДАКТИРОВАТЬ: я включаю информацию об исходном каталоге dir / tw / s для устранения неполадок. Папка ABT - это папка, которую следует удалить.

 Directory of C:\

09/27/2016  03:08 PM    <DIR>    .
09/27/2016  12:10 PM    <DIR>    ..
09/27/2016  03:09 PM    <DIR>    New Folder
06/25/2014  05:47 AM    <DIR>    abt
               0 File(s)

 Directory of C:\New folder

09/27/2016  03:09 PM    <DIR>
09/27/2016  03:08 PM    <DIR>
09/27/2016  03:09 PM
               1 File(s)

 Directory of C:\abt

06/25/2014  05:47 AM    <DIR>
09/27/2016  03:08 PM    <DIR>
03/20/2014  10:08 AM
06/25/2014  05:47 AM
04/28/2014  02:33 PM
05/20/2014  10:47 AM    <DIR>
02/18/2014  07:24 PM
05/20/2014  10:51 AM
               5 File(s)

 Directory of C:\abt\Scripts

05/20/2014  10:47 AM    <DIR>
06/25/2014  05:47 AM    <DIR>
10/02/2012  11:18 AM
02/02/2012  12:16 PM
02/17/2012  11:32 AM

person Tom Wildt    schedule 27.09.2016    source источник
comment
Конечно rmdir /S удаляет все, это то, для чего он нужен; вы можете добавить параметр /MOVE в robocopy, чтобы он перемещал совпадающие файлы и каталоги в место назначения, тогда вы можете опустить всю for /D %%p командную строку ...   -  person aschipfl    schedule 27.09.2016
comment
/ move удалит родительский каталог (исходный каталог). Мне нужно сохранить это. Таким образом, он удалит 'c: \ source'. Кроме того, если бы я использовал / mov, это не привело бы к удалению подкаталога в 'c: \ source'.   -  person Tom Wildt    schedule 27.09.2016
comment
Вы можете использовать forfiles для тестирования возраста, а затем написать любую команду, которая вам нужна. forfiles /D -10 /C "cmd /c if @isdir==TRUE echo copying @relPath"   -  person FloatingKiwi    schedule 27.09.2016
comment
@FloatingKiwi Я очень надеялся, что это сработает. Я попробовал это и получил сообщение об ошибке (неверный синтаксис команды). FORFILES /P C:\source /M *.* /D -10 /C "CMD /C RMDIR /s /q"   -  person Tom Wildt    schedule 27.09.2016
comment
@FloatingKiwi: Также, когда я пробую эту команду, я получаю сообщение об ошибке (файлы не найдены с указанными критериями поиска), но есть более старые каталоги и файлы, чем 10 дней. FORFILES /P C:\source /M *.* /D -10 /C "CMD /C RMDIR /s /q @path"   -  person Tom Wildt    schedule 27.09.2016
comment
Используемые даты - это даты последнего изменения, а не дата создания. Это может быть проблема, которую вы наблюдаете. Если вы опубликуете результат dir /TW /S c:\source, мы сможем помочь больше   -  person FloatingKiwi    schedule 28.09.2016
comment
Когда вы говорите, что не хотите удалять исходный каталог, вы говорите о самой папке или о файлах внутри нее?   -  person MC ND    schedule 28.09.2016
comment
@FloatingKiwi, я отредактировал исходный пост с результатами.   -  person Tom Wildt    schedule 28.09.2016
comment
@MCND, исходный каталог должен остаться, сам исходный каталог, папки и файлы в этом исходном каталоге я хочу удалить. Само по себе robocopy / move было бы достаточно, если бы он не удалил исходный каталог ...   -  person Tom Wildt    schedule 28.09.2016
comment
Хм ... /MOVE может и удалит исходный каталог только в том случае, если все подпункты соответствуют всем фильтрам ...   -  person aschipfl    schedule 29.09.2016


Ответы (1)


Если robocopy может справиться со всем, кроме удаления папки, единственное, что вам нужно сделать, это убедиться, что robocopy не сможет удалить папку.

Это можно сделать, просто установив исходную папку в качестве текущего активного каталога. Вы не можете удалить используемую папку.

SET "source1=c:\source"
SET "destination=F:\destination"
SET "switch1=/move /e /create /minage:10 /r:10 /w:1 /LOG+:F:\logs\backup.log"

pushd "%source1%" && (
    robocopy . "%destination%" %switch1%
    popd
)

Единственным недостатком является то, что robocopy покажет ошибку, говоря, что он не может удалить исходную папку, потому что она уже используется.

person MC ND    schedule 28.09.2016
comment
с этим было круто возиться. Однако, когда я запускаю пакет таким образом, у папки c: \ source1 \ abt была дата запуска старше 10 дней, я наблюдал, как эта дата изменилась после того, как пакет был запущен до текущей даты. В папке abt также есть папка сценариев, она тоже имела дату старше 10 дней, и эта дата также изменяется на текущую дату после пакетного запуска. Итак, что происходит: все файлы из этой папки abt перемещаются в место назначения, оставляя за собой как c: \ source1 \ abt, так и c: \ source1 \ abt \ scripts. Но папка c: \ source1 \ New Folder не перемещается и не изменяется. - person Tom Wildt; 28.09.2016
comment
По сути, это то же самое, что происходит, когда я запускаю его изначально, не устанавливая source1 в качестве текущего активного каталога, и я использую команду / mov. - person Tom Wildt; 28.09.2016
comment
Я не знаю, имеет ли это значение, но C: на самом деле является сетевым ресурсом. Я замаскировал это C: \ для общедоступных веб-целей. - person Tom Wildt; 28.09.2016
comment
Сообщение об ошибке, указанное в ответе, можно избежать с помощью _1 _... - person aschipfl; 28.09.2016
comment
@TomWildt, изменение даты в папке - обычное поведение (дата папки отражает последнее изменение внутри папки). Но если папка не удалена, то 1. - Возможно, /mt мешает самому себе (нет, я так не думаю, но ...) 2. - Не все файлы удаляются, потому что они не соответствуют переключателям выбора, поэтому папки не пустые и они не удаляются. Для первого варианта попробуйте удалить переключатель /mt. Второй случай не может быть решен с помощью robocopy, и лучше всего включить rmdir . /s /q между строками robocopy и popd. - person MC ND; 29.09.2016
comment
@aschipfl, спасибо, но нет. robocopy выводит свои операционные ошибки в stdout (и / или в файл журнала). - person MC ND; 29.09.2016
comment
@TomWildt, извините, я забыл, что вы хотите удалить только папки, участвующие в копии. Пожалуйста, забудьте про опцию rmdir. - person MC ND; 29.09.2016
comment
Извините, вы правы, я не тестировал ... так что (зависящее от языка) сообщение может быть отфильтровано find /V, если параметр /LOG заменен перенаправлением _3 _... - person aschipfl; 29.09.2016
comment
Вот и все. Многопоточный переключатель (/ mt) вызывал проблему ... Есть идеи, почему это так? Запуск на Windows Server 2k8 R2. - person Tom Wildt; 29.09.2016
comment
@TomWildt, без отладки robocopy Могу поспорить, что один поток пытается удалить папку, а другой по-прежнему содержит ссылку внутри. - person MC ND; 29.09.2016