网络共享上的桌面备份维护

网络共享上的桌面备份维护

我已在 Windows 7 Professional 桌面上配置了 Windows 备份和还原功能,以便对位于 Windows Server 2012 上的网络共享进行每日备份。(顺便说一句,遗憾的是,此实用程序没有使用当前登录用户的凭据(尤其是 Active Directory 用户的凭据)的选项。相反,必须输入固定用户的凭据。因此,在 Active Directory 中更改密码时,密码不会更新。)此实用程序也没有任何用于自动删除旧备份版本的维护机制。因此,它会产生大量过时的数据,很快就会填满服务器的磁盘空间。
现在我在目录结构中遇到了这种情况(这仅适用于一个用户,但“用户”目录中有许多其他用户的文件夹):

Users  
├─agnes.microt  
│   ├─AGNES-PC  
│   │   ├─Backup Set 2014-02-24 060001  
│   │   │   ├─Backup Files 2014-02-24 060001  
│   │   │   ├─Backup Files 2014-02-25 091044  
│   │   │   ├─Backup Files 2014-02-26 092458  
│   │   │   └─Catalogs  
│   │   └─Backup Set 2014-02-27 091933  
│   │ ++      ├─Backup Files 2014-02-27 091933  
│   │ ++      └─Catalogs  

我想要做的是删除(通过在每日计划任务中运行批处理文件)所有日期超过一天的“备份集”文件夹,只为每个用户保留最新的备份集。这很简单,但也有几天不在公司的用户。因此,尽管他们的最新备份集已经过时,但它应该保留在服务器上。
我做了这样一个批处理:

forfiles /D -1 /P D:\User /M "Backup Set *" 
    /S /C "cmd /c if @ISDIR==TRUE (dir /b /a:d | find /c \"Backup Set\") 
    | (if not %1==\"1\" (rmdir /s /q @file))"

我不知道如何将“dir+find”结果传递给其后的“if”命令。
任何帮助都将不胜感激。以及有关此问题/难题主题的任何其他开放性建议。

答案1

我只是询问操作系统哪个目录是最新的,然后从那里开始。

批处理(笨重,但可以运行 - 它通过从最旧到最新的排序来找到最新的文件夹,将文件夹移动到临时目录,将最新的文件夹移回,然后删除临时目录):

FOR /F " tokens=*" %%i IN ('dir "c:\temp\backup*" /b /ad-h /od') DO (SET a=%%i) 
mkdir temp
FOR /F " tokens=*" %%i IN ('dir /b /ad-h /od') DO (move "%%i" temp)
cd temp
move "%a%" ..
cd ..
rd /s /q temp 

PowerShell(查找最新目录,删除非最新的目录):

$latest = get-childitem c:\temp\backup* | ? { $_.PSIsContainer } | sort CreationTime -desc | select -f 1
Get-ChildItem -Path  'C:\temp\backup*' -Recurse | ? { $_.PSIsContainer } | Select -ExpandProperty FullName | Where {$_ -notlike $latest} |sort length -Descending | Remove-Item -force 

答案2

好的,我使用 PowerShell 成功完成了此操作,并基于http://nisanthkv.blog.com/2012/07/30/removing-backup-folders-solution-1
结果如下:
Get-ChildItem MediaID.bin -Path D:\Users -Recurse | ForEach-Object {$_.DirectoryName} | ForEach-Object {Get-ChildItem "Backup Set*" -Path $_ | Sort-Object LastWriteTime -descending | Select-Object -Skip 1 | ForEach-Object {“Removing file $($_.FullName)”; Remove-Item $_.FullName -Recurse -Force}}

相关内容