Я хочу удалить определенное количество старых файлов в папке.УМК

у меня есть папка резервного копирования, где на каждый день резервная папка (например, 15.06.; 14.06; 13.06.....), содержащий резервные файлы.

теперь я хочу a удалить (in .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"

поздравления

Edit: то, что я сейчас тестирую, это:

set Pf_ZielBackup=Z:BackupsFWichtigVerRoboVersion


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", он перечисляет меня в commandprompt, три самых старых файла просто отлично. Кто-нибудь знает как это исправить?

Edit2 теперь скрипт запускается, но удаляет все папки - я должен был остановить его после того, как он удалил 10 папок (должен был удалить 0)... в подкаталоге-что-то с логикой счетчика должно быть не так Угадай:

set Pf_ZielBackup=Z:BackupsFWichtigVerRoboVersion


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
7
задан user54512
17.02.2023 17:15 Количество просмотров материала 3157
Распечатать страницу

2 ответа

Как сказал Рамхаунд в своем комментарии, самый простой способ достичь этой цели - использовать 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 или пакетных файлов.

[UPDATE]: как название было запутанным, вот обновление моего ответа:

$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

объяснениями :

  • the $dnd (не удалять) переменная будет содержать список папок для хранения : в моем примере 2 старейших из C:\Test directory;
  • the $list переменная перечислит все папки под c:\Test ;
  • третья строка скрипта принудительно удалит папки, исключая все содержащиеся в $dnd переменной. Не забудьте удалить -WhatIf переключатель, когда вы уверены.

надеюсь, что это помогает !

1
отвечен Ob1lan 2023-02-19 01:03

я хочу удалить определенное количество самых старых каталогов в папке

вы можете использовать следующий пакетный файл:

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 и "первый"!--15-символьный. Она должна быть:

for /f "tokens=*" %%a in ('dir %target% /a:d /b /o:d') do ...

не забудьте изменить и for /f команды.

вам также нужно добавить %target%\ для двух команд Эхо:

echo directory !_count! is %target%\%%a
echo rd /q %target%\%%a
0
отвечен DavidPostill 2023-02-19 03:20

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх