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" из 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

2 ответа2

1

Как сказал Ramhound в своем комментарии, самый простой способ достичь этой цели - использовать PowerShell. Вот простой скрипт для этого:

$list = Get-ChildItem -Path c:\temp  | Sort-Object LastWriteTime -Descending | Select-Object -Last 10
$list | Remove-Item -Force -WhatIf

Этот скрипт удалит 10 самых старых файлов в папке C:\Temp. Обратите внимание, что параметр -Whatif позволяет вам проверить, что будет делать эта команда, фактически не делая этого. Просто удалите этот параметр, когда будете готовы выполнить операцию.

Конечно, вы можете сделать этот скрипт запущенным в запланированном задании, как вы делаете это с 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;
  • переменная $ list будет перечислять все папки в c:\Test;
  • третья строка скрипта принудительно удалит папки, исключая все содержащиеся в переменной $ dnd . Не забудьте удалить переключатель -WhatIf, если вы уверены.

Надеюсь это поможет !

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 /f с dir чтобы получить список каталогов
  • /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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .