У меня есть папка для резервного копирования, где на каждый день есть папка для резервного копирования (например, 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