我想用 .cmd 删除文件夹中一定数量的最旧文件

我想用 .cmd 删除文件夹中一定数量的最旧文件

我有一个备份文件夹,其中每天都有一个备份文件夹(例如 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 /fwithdir获取目录列表
  • /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

相关内容