通过网络删除文件夹
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
识别为有效路径,即使它已在注册表中定义。
这里的性能可能是一个问题 - 如果要删除的文件首先在启动命令的主机上移动,则可能需要很长时间。在这种情况下,也许可以将脚本安排到服务器本身上的 运行。
通过网络路径,每天添加两个巨大的文件夹,命名格式为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
识别为有效路径,即使它已在注册表中定义。
这里的性能可能是一个问题 - 如果要删除的文件首先在启动命令的主机上移动,则可能需要很长时间。在这种情况下,也许可以将脚本安排到服务器本身上的 运行。