【问题标题】:Deleting folders over network通过网络删除文件夹
【发布时间】:2018-08-31 13:35:32
【问题描述】:

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

SOURCE PATH TOO LONG

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

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

我找到了许多解决方案来实现这一点,但由于上述所有文件夹都发生“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

【问题讨论】:

  • 在删除前四个月内内容未修改的目录时,我认为没有理由每三分钟甚至每天运行一次脚本!

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @user1016274...谢谢!..这种方法真的很有帮助。
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多