【问题标题】:Batch file to delete all folders in a directory except the newest folder批处理文件删除目录中除最新文件夹外的所有文件夹
【发布时间】:2015-06-14 11:20:31
【问题描述】:

我正在尝试在完成新备份后删除特定文件夹中的旧备份。由于我真的没有 DOS 命令的经验,我将我在互联网上找到的几个脚本组合成一个:

::(C)2008 "BuckFix" www.winsupportforum.de
@echo off
setlocal

set workdir="M:\BACKUPS\CACHE_SSD\"
set folder=
:: get list of all folders, oldest first
dir %workdir% /AD /B /t:w /OD > %temp%folder.tmp
for /f "tokens=1* delims=" %%i in (%temp%folder.tmp) do set "folder=%%i"
del %temp%folder.tmp

::checking if its the right one...just for debugging
echo newest... %folder%

set filedir="M:\BACKUPS\CACHE_SSD\%folder%"

::delete all folders except %folder% ...but how?

pause

所以选择最新的文件夹可以正常工作,但我不知道如何删除除那个文件夹之外的所有文件夹。我认为这只是一个简单的 for 循环,但到目前为止我所有的尝试都失败了。 它必须是一种安全的方法,因为它是一个备份文件夹,我只想保留最新的备份。我删除了有效的脚本,但是当只有一个文件夹时,它也删除了那个文件夹。当目录为空时,它会杀死整个目录。

【问题讨论】:

  • 设法让它与这个尝试一起工作:pushd "%filedir%" && rd /s /q "%workdir%" 2>nul你认为这是一个好的选择吗?
  • 其实这是一个聪明的解决方法
  • 问题是,它也会删除子文件夹。因此,如果我有最新的文件夹并且其中有两个子文件夹,它会删除两个子文件夹,但不会删除主文件夹。我需要它来保留文件夹的内容...你知道我可以如何修改它以将所有子文件夹保留在最新的文件夹中吗?

标签: batch-file backup directory


【解决方案1】:
@echo off
setlocal

set "workdir=M:\BACKUPS\CACHE_SSD\"
set "folder="
for /f "tokens=* delims=" %%i in ('dir %workdir% /AD /B /TW /O-D') do (
    set "folder=%%~fi"
    goto :break
)
:break
echo newest... %folder%

for /f "skip=1 tokens=* delims=" %%i in ('dir %workdir% /AD /B /TW /O-D') do   (
    echo rd /s /q "%%~fi"
)

pause

测试这个。实际删除命令被回显。如果一切正常,删除echo rd /s /q "%%~fi" 中的回显。

【讨论】:

  • 谢谢!但奇怪的是,这会删除最新的文件夹并保留最旧的文件夹。
  • @Malte - 已修复!立即检查。
  • 那行得通!但它在echo rd /s /q "%%~fi" 中使用了错误的目录,它使用 M:\BACKUPS\-foldername- 而不是 M:\BACKUPS\CACHE_SSD\-foldername-
  • @Malte - %folder% 是正确的,在第二个循环中更改它。
  • 等一下,我应该在哪里更换它?因为echo %folder% 打印 M:\BACKUPS\foldername。我在哪里可以改变它?