我有一个备份文件夹,其中每天都有一个备份文件夹(例如 15.06.;14.06;13.06.....)包含备份文件。
我现在想要删除(在 .cmd 文件中)数量为 x 个最旧的文件夹,以便文件夹中仍然有 30 个最新文件。
我试过:
set Pf_TargetForfiles=Z:\Backups
set AnzahlOrdner=
for /d %%a in (Z:\TargetForfiles\*) do set /a AnzahlOrdner+=1
If %AnzahlOrdner% GTR 30 forfiles /p "%Pf_ZielForfiles%" /d -42 /c "CMD /c if @isdir==TRUE rd @path /s /q"
问候
编辑:我现在正在测试的是:
set Pf_ZielBackup=Z:\Backups\F\WichtigVer\Robo\Version\
echo off
Setlocal EnableDelayedExpansion
set "_count=0"
rem count the files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do @(set /a _count+=1 >nul)
echo !_count! directories found
rem delete _count-27 files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do (
set /a _count-=1
echo directory !_count! is %%a
echo rd /q %%a
if "!_count!"=="27" (
goto :done
)
)
:done
pause
对我来说,这段代码有一个非常奇怪的问题,当我从中删除“echo”echo rd /q %%a
时,我会收到来自 Windows 的错误消息(系统找不到指定的文件。但是,如果我使用“echo”运行脚本,它会在命令提示符中列出三个最旧的文件。有人知道如何解决这个问题吗?
编辑2现在脚本运行但删除所有文件夹- 在它删除了 10 个文件夹(应该删除 0 个)后我不得不停止它...在子目录中 - 我猜计数器逻辑一定出了问题:
set Pf_ZielBackup=Z:\Backups\F\WichtigVer\Robo\Version\
echo off
Setlocal EnableDelayedExpansion
set "_count=0"
rem count the files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do @(set /a _count+=1 >nul)
echo !_count! directories found
rem delete _count-30 files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do (
set /a _count-=1
echo directory !_count! is %Pf_ZielBackup%\%%a
rd /s /q %Pf_ZielBackup%\%%a
if "!_count!"=="30" (
goto :done
)
)
:done
pause
答案1
正如 Ramhound 在他的评论中所说,实现此目标的最简单方法是使用 PowerShell。这是一个简单的脚本:
$list = Get-ChildItem -Path c:\temp | Sort-Object LastWriteTime -Descending | Select-Object -Last 10
$list | Remove-Item -Force -WhatIf
此脚本将删除 C:\Temp 文件夹中最旧的 10 个文件。请注意-如果什么参数允许您检查此命令将执行的操作,而无需实际执行该操作。当您准备执行操作时,只需删除此参数即可。
当然,你可以编写这个脚本在计划任务中运行,就像处理 exe 或批处理文件一样。
[更新] :由于标题令人困惑,以下是我的答案的更新:
$dnd = Get-ChildItem -Path c:\Test -Directory | Sort-Object LastWriteTime -Descending | select -last 2
$list = Get-ChildItem -Path c:\Test -Directory
$list | Remove-Item -Recurse -Force -Exclude $dnd -WhatIf
解释:
- 这$dnd(不要删除)变量将包含要保留的文件夹列表:在我的示例中,是 C:\Test 目录中最旧的 2 个文件夹;
- 这$列表变量将列出 c:\Test 下的所有文件夹;
- 脚本的第三行将强制删除文件夹,但不包括$dnd变量。不要忘记删除-如果什么当你确定时,请切换。
希望这可以帮助 !
答案2
我想删除文件夹中一定数量的最旧目录
您可以使用以下批处理文件:
echo off
Setlocal EnableDelayedExpansion
set "_count=0"
rem count the files
for /f "tokens=*" %%a in ('dir /a:d /b /o:d') do @(set /a _count+=1 >nul)
echo !_count! directories found
rem delete _count-30 files
for /f "tokens=*" %%a in ('dir /a:d /b /o:d') do (
set /a _count-=1
echo directory !_count! is %%a
echo rd /q %%a
if "!_count!"=="30" (
goto :done
)
)
:done
怎么运行的:
- 使用
for /f
withdir
获取目录列表 /a:d
仅限目录- 使用
/b
,所以我们不计算.
,..
o:d
按日期排序(最老的第一的)- 计算目录数量
- 再次处理列表
- 每匹配一次,计数减少
- 删除匹配项
- 停止于 30(保留 30 个目录)
完成批处理文件测试后,将其替换echo rd /q %%a
为。rd /q %%a
我无法正确获取目录路径
如果路径是:
set target=z\backup....
我试过:
for /f "tokens=*" %%a in (%target% /a:d /b /o:d') do....
您的尝试缺少dir
和第一个'
字符。应该是:
for /f "tokens=*" %%a in ('dir %target% /a:d /b /o:d') do ...
别忘了改变两个都 for /f
命令。
还需要添加%target%\
两个 echo 命令:
echo directory !_count! is %target%\%%a
echo rd /q %target%\%%a