通过网络删除文件夹

时间:2018-08-31 13:35:32

标签: batch-file window batch-processing delete-file robocopy

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

SOURCE PATH TOO LONG

因此,我创建了以下客房整理批处理,以使用ROBOCOPY路径一次选择最旧的文件夹作为输入来删除那些顽固的文件夹。

我已安排此批处理每3分钟运行一次,并且工作正常。但是我希望这批文件只删除到四个月以上的文件夹为止。

我发现了许多解决方案,但是由于所有文件夹均发生上述“ SOURCE PATH TOO LONG”错误,因此无法退出此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

2 个答案:

答案 0 :(得分:0)

这是一个混合脚本,您可以设置天数。您需要将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 :(得分:0)

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

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