通过网络删除文件夹

Deleting folders over network

通过网络路径,每天添加两个巨大的文件夹,命名格式为BKP_YYYYMMDDhhmm。当我们尝试手动删除这些文件夹以进行整理时,它会抛出众所周知的错误:

SOURCE PATH TOO LONG

所以我创建了下面的管理批处理,使用 ROBOCOPY 路由一次选择最旧的文件夹作为输入来删除那些顽固的文件夹。

我已将此批次安排为每 3 分钟 运行,并且运行良好。但是我希望这批只删除超过 4 个月的文件夹。

我找到了许多实现此目的的解决方案,但由于所有文件夹都发生上述“源路径太长”错误,因此无法离开此 ROBOCOPY 路径。

能否指导我在下面的脚本中需要做哪些修改,以便可以安排在一天中的固定时间 运行 删除超过 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

这是一个可以设置天数的混合脚本。您需要将 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

我提出一个两步解决方案:
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 识别为有效路径,即使它已在注册表中定义。

这里的性能可能是一个问题 - 如果要删除的文件首先在启动命令的主机上移动,则可能需要很长时间。在这种情况下,也许可以将脚本安排到服务器本身上的 运行。