使用批处理脚本删除除最新文件夹之外的所有文件夹

时间:2017-08-31 20:33:26

标签: loops batch-file

我正在尝试使用批处理脚本删除除最新文件夹以外的所有文件夹。

类似的问题已经被问到here,所以我尝试将其用作模板,事情变得搞砸了。

我需要清除除最新文件夹之外的所有文件夹实际上是一个包含备份的文件夹。在另一个脚本中,我正在备份包含此文件夹的文件夹,该文件夹还包含此备份文件夹。

H:\ LOS 是要备份的文件夹。

H:\ LOS \ DefaultChromeCopy 是包含每天拍摄的 H:\ LOS \ Default 备份的文件夹。

我想备份 H:\ LOS ,但我不需要 DefaultChromeCopy 中的任何文件夹,因为我已经备份了默认值。我将每周运行一次,所以我想暂时将 DefaultChromeCopy 目录中的最新文件夹移动到 T:\ Backups 以便安全保存,然后删除<中的所有文件夹strong> DefaultChromeCopy ,然后备份 H:\ LOS 。该备份还将转到 T:\ Backups ,然后我可以将 DefaultChromeCopy 中最新文件夹的文件夹移回原来的位置。

所以最后,我将使用空的DefaultChromeCopy文件夹备份 H:\ LOS H:\ LOS \ DefaultChromeCopy 中的所有文件夹将已被删除,除了最新的(&#34;移动&#34;暂时)。

所以,使用其他SO答案中的代码作为起点,我有这个(没有围绕回声的星号):

if not exist "T:\Backups" md "T:\Backups"
set "workdir=H:\LOS\DefaultChromeCopy"
set "folder="
for /f "tokens=* delims=" %%i in ('dir %workdir% /AD /B /TW /O-D') do (
    set "folder=%%~fi"
    **echo** robocopy H:\LOS\DefaultChromeCopy\%folder% T:\Backups\%folder% /e /w:0 /r:2
    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"
)

我已经设置了一个虚拟驱动器H和虚拟驱动器T并对文件夹进行了建模,以便对其进行测试。

enter image description here

您可以看到 ne 是最新的文件夹。

用星号表示的回声,我得到:

newest... H:\ne
rd /s /q "H:\sdf"
rd /s /q "H:\6"
rd /s /q "H:\5"
rd /s /q "H:\4"
rd /s /q "H:\3"
rd /s /q "H:\2"
rd /s /q "H:\1"

&#34;最新&#34;的路径曾经是对的,但现在即使这样也不对。

我已经在这里停了下来,因为已经出现了很多问题。我该如何修复路径?另外,如果我在没有回声的情况下运行,DefaultChromeCopy中的所有文件夹(有时甚至是陌生人,除ne和sdf之外的所有文件夹)都会被复制到 T:\ Backups ,这不是我想要的即将发生。应该只复制最新的文件夹。

以下是实际执行&#34;备份&#34;的部分,然后将%folder%移回原来的位置(%folder%是DefaultChromeCopy中的最新文件夹)。

robocopy "H:\LOS\" "T:\Backups\LOS_Backup_%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%TIME:~0,2%.%TIME:~3,2%" /e /w:0 /r:2
robocopy T:\Backups\%folder% H:\LOS\DefaultChromeCopy /e /w:0 /r:2
start "" "T:\Backups"

DefaultChromeCopy中的目录在创建后不会被修改,因此创建日期和修改日期应该相同。我只想将最新的文件夹保存在DefaultChromeCopy中,将其移动到T:\ Backups,这样我就可以删除DefaultChromeCopy中的所有文件夹进行备份(我甚至不需要大备份中的最新备份我&#39 ; m)。希望这一切都有意义......

更新

运行:

setlocal ENABLEDELAYEDEXPANSION
set "workdir=H:\LOS\DefaultChromeCopy"
set "folder="
for /f "tokens=* delims=" %%i in ('dir %workdir% /AD /B /TW /O-D') do (
    set "folder=%%~fi"
    echo %%~fi
    echo robocopy %%~fi T:\Backups\!folder! /e /w:0 /r:2
    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 "%workdir%\%%~i"
)

产生

H:\ne
robocopy H:\ne T:\Backups\H:\ne /e /w:0 /r:2
newest... H:\ne
rd /s /q "H:\LOS\DefaultChromeCopy\sdf"
rd /s /q "H:\LOS\DefaultChromeCopy\6"
rd /s /q "H:\LOS\DefaultChromeCopy\5"
rd /s /q "H:\LOS\DefaultChromeCopy\4"
rd /s /q "H:\LOS\DefaultChromeCopy\3"
rd /s /q "H:\LOS\DefaultChromeCopy\2"
rd /s /q "H:\LOS\DefaultChromeCopy\1"

所以看起来应该被删除的目录被删除,但是&#34;最新的&#34;部分仍然有点不稳定。 我需要弄清楚如何获得&#34; H:\ LOS \ DefaultChromeCopy \ ne&#34;。现在:

%%~fi --> H:\ne
%workdir%\%%~fi --> H:\LOS\DefaultChromeCopy\H:\ne
T:\Backups\!folder! --> T:\Backups\H:\ne
T:\Backups\%folder% --> T:\Backups\
?????????????!!!!! --> H:\LOS\Default\ChromeCopy\ne & T:\Backups\ne

幸运的是,我找到了一种解决方法。 DefaultChromeCopy中只剩下1个文件夹,所以即使我无法弄清楚如何引用它,我也可以引用它的父文件。因此,运行以下操作会从DefaultChromeCopy中删除除最新文件夹以外的所有文件夹,将DefaultChromeCopy备份到T:\ Backups,删除DefaultChromeCopy中的所有内容,将H:\ LOS备份到T:\ Backups,然后将DefaultChromeCopy复制回H:\ LOS \ DefaultChromeCopy并从T:\ Backups中删除它。

这是最终的工作脚本。感谢大家的帮助:

@echo off
echo Beginning LOS backup - deleting all Chrome backups except the newest one
if not exist "T:\Backups" md "T:\Backups"
setlocal ENABLEDELAYEDEXPANSION
set "chromebackups=H:\LOS\DefaultChromeCopy"
set "folder="
for /f "tokens=* delims=" %%i in ('dir %chromebackups% /AD /B /TW /O-D') do (
    set "folder=%%~fi"
    echo folder is !folder!
    goto :deleteolds
)
:deleteolds
for /f "skip=1 tokens=* delims=" %%i in ('dir %chromebackups% /AD /B /TW /O-D') do   (
    rd /s /q "%chromebackups%\%%~i"
)
robocopy "H:\LOS\DefaultChromeCopy" "T:\Backups\DefaultChromeCopy" /e /w:0 /r:2
set topurge="H:\LOS\DefaultChromeCopy"
cd /d %topurge%
for /f "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
setlocal DISABLEDELAYEDEXPANSION
robocopy "H:\LOS" "T:\Backups\LOS_Backup_%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%TIME:~0,2%.%TIME:~3,2%" /e /w:0 /r:2
robocopy "T:\Backups\DefaultChromeCopy" "H:\LOS\DefaultChromeCopy" /e /w:0 /r:2
rmdir "T:\Backups\DefaultChromeCopy" /s /q
start "" "T:\Backups"
echo LOS Backup has completed! You can now ZIP the folder in T:\Backups\, upload that to the LOS Repository server, and then delete T:\Backups manually.

0 个答案:

没有答案