我已在 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}}