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


1

我有一个备份文件夹,每天都有一个备份文件夹(如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 rd /q %%a 然后我从Windows收到一条错误消息 (系统找不到指定的文件。但如果我用“echo”运行脚本,它会在命令提示符中列出三个最旧的文件就好了。有人知道如何解决这个问题吗?

Edit2 Now脚本运行但删除所有文件夹 - 我必须在它删除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

4
您应该能够使用Powershell脚本执行此操作。
Ramhound

或批处理文件。
DavidPostill

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
user54512

Answers:


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 (不要删除)变量将包含要保留的文件夹列表:在我的示例中,2个最旧的C:\ Test目录;
  • $列表 变量将列出c:\ Test下的所有文件夹;
  • 脚本的第三行将强制删除文件夹,不包括所有文件夹 $ DND 变量。别忘了删除 -如果 在你确定的时候切换。

希望这可以帮助 !


这不会删除最老的x离开30.而且他想要删除目录而不是文件。
DavidPostill

问题标题是:我想删除.cmd文件夹中的一定数量的最旧文件。这就是我发布删除文件的命令的原因。问题是他还说:“我现在想要删除(在.cmd文件中)一定数量的x最旧的文件夹”,这就是我发布这样一个答案的原因。当然,他可以根据自己的目标进行调整。
Ob1lan

对于我造成的困惑,我很抱歉。我完全错了标题。它必须是:... x个最旧目录的数量......
user54512

我的回答是正确的,多亏了你的新解释:)比批处理文件更简洁,更容易理解,不是吗?
Ob1lan

嗨我检查了你的脚本及其产生非常令人困惑的结果:[link]( 1drv.ms/1BgFRvK )在测试文件夹中有21个文件夹,13个脚本要删除。列表出现问题或者使用“lastwritetime”(我不知道那是什么,比如修改日期?)问候
user54512

0

我想删除文件夹中的一定数量的最旧目录

您可以使用以下批处理文件:

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 /fdir 获取目录列表
  • /a:d 仅限目录
  • 使用 /b 所以我们不算数 ...
  • o:d 按日期排序( 最老的 第一)
  • 计算目录
  • 再次处理列表
  • 每次比赛减少计数
  • 删除匹配
  • 停在30(留下30个目录)

更换 echo rd /q %%ard /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

我无法在那里找到目录的路径。例如,如果路径是:set target = z \ backup ....我试过: for /f "tokens=*" %%a in (%target% /a:d /b /o:d') do....
user54512

???例如,如果路径是什么?你的意思是 Z:\TargetForfiles\*? Or Z:\ Backups`?包含要删除的子目录的父目录的名称是什么?
DavidPostill

喔好吧。它只是一个例子,例如包含目录的Path将是:Z \ Backups。
user54512

答案已更新。
DavidPostill

嗨大卫,我的解决方案有一些奇怪的问题。虽然测试它看起来很好然后我删除了“回声”有两个问题:1。不知何故在“设置”之前有一个“怪异”的标志,结果看起来可怕的srcipt然后在我的桌面上熄灭?如果找不到路径,是否可以删除其他文件夹? [链接]( 1drv.ms/1CaHs0I )我修复了错误1后得到了2.错误。用英文说:系统找不到指定的文件...... [链接]( 1drv.ms/1J1aisv ) 有任何想法吗?附:感谢您一直以来的帮助...
user54512
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.