Удаление папок по сети - PullRequest
       16

Удаление папок по сети

0 голосов
/ 31 августа 2018

По сетевому пути ежедневно добавляются две папки большого размера в формате имен BKP_YYYYMMDDhhmm. Когда мы пытаемся вручную удалить эти папки для домашнего хозяйства, выдается известная ошибка:

SOURCE PATH TOO LONG

Итак, я создал ниже служебную партию для удаления этих упрямых папок, используя маршрут ROBOCOPY, выбирая самую старую папку в качестве входной за один раз.

Я запланировал запуск этой партии каждые 3 минуты, и она работает нормально. Но я хочу, чтобы этот пакет удалялся только до тех папок, которые старше 4 месяцев.

Я нашел много решений для достижения этой цели, но не могу покинуть этот маршрут ROBOCOPY из-за вышеупомянутой ошибки "SOURCE PATH TOO LONG", возникающей для всех папок.

Не могли бы вы подсказать мне, какие изменения мне нужно сделать в приведенном ниже сценарии, чтобы можно было запланировать запуск в определенное время дня для удаления папок старше 4 месяцев?

Заранее спасибо!

@echo off

pushd \\networkpath\backupdirectory

for /f "delims=" %%a in ('dir "BKP_*" /a:d /o:-d /b') do set "folder=%%a"

echo %folder% >> D:\data\logs\Log.txt

rmdir emptyfolder
mkdir emptyfolder
robocopy emptyfolder "%folder%" /purge                  
rmdir %folder%
rmdir emptyfolder

exit

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Предлагаю двухэтапное решение:
1 - переместить файлы старше x дней во временную папку
2 - полностью удалить эту папку

@echo off

pushd \\networkpath\backupdirectory

REM move old files to temp folder
set tmp=%RANDOM%.tmp
md %tmp%
robocopy . %tmp% /E /MOVE /XD %tmp% /minage:120 /R:1 /W:1

REM delete temp folder
set empty=%RANDOM%.tmp
md %empty%
robocopy %empty% %tmp% /E /purge

rd %tmp%
rd %empty%

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

Что я действительно хотел сделать, это переместить выбранные файлы в NUL. Увы, robocopy не распознает NUL как допустимый путь, даже если он определен в реестре.

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

0 голосов
/ 31 августа 2018

Вот гибридный скрипт, который вы можете установить количество дней. Вам нужно изменить day=-120 на соответствующее количество дней, которое вы хотите. Он не учитывает время, поэтому используйте планировщик для запуска в любое время суток.

@echo off
set day=-120
pushd \\networkpath\backupdirectory
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
del "%temp%\*%~n0.vbs"
set "yyyy=%result:~0,4%"
set "mm=%result:~4,2%"
set "dd=%result:~6,2%"
set "final=%yyyy%%mm%%dd%"
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir "BKP_*" /a:d /o:-d /b') do (
set "folder=%%a"
set folddate=!folder:~4,8!
if !folddate! LSS !final! call :work
)
goto :EOF

:work
echo !folder! >> D:\data\logs\Log.txt
rmdir emptyfolder
mkdir emptyfolder
robocopy emptyfolder "!folder!" /purge                  
rmdir !folder!
rmdir emptyfolder
...