|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление файлов по дате больших размеров. |
|
|
CMD/BAT - [решено] Удаление файлов по дате больших размеров.
|
Новый участник Сообщения: 7 |
Профиль | Отправить PM | Цитировать Помогите разобраться пожалуйста. Я нашел скрипт, который хорошо выполняет свою функцию, удаляя устаревшие папки, но оставляя всегда нужное фиксированное количество резерва. Вот он:
@echo off SetLocal EnableExtensions set BackUp=MyDisk:\MyBackUp set Num=10 pushd %BackUp% for /f "tokens=* delims=" %%D in ('dir /ad /b /o-d') do call :Proceed "%%D" popd exit :Proceed if not %Num%==0 set /a Num-=1&exit /b echo %date% %time%: Erase %1>>%~dpn0.log rd /s /q %1 2>nul >nul exit /b Но есть 2 нюанса и соответственно в них и нужна помощь. 1. Этот скрипт не справляется вообще никак при работе с файлами очень больших размеров. А нужно удалять файлы объемом от 100ГБ+. 2. Когда очень много директорий, то приходиться прописывать условие и цикл для каждой директории, что конечно не есть хорошо. И кода много и батник при исполнении получается огромным. Помогите разобраться плиз. За ранее спасибо. |
|
Отправлено: 20:04, 20-12-2011 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 17:08, 21-12-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать 1. Этот скрипт не справляется вообще никак при работе с файлами очень больших размеров - А почему бы не воспользоваться vbs или js ?
2. Как понять: Когда очень много директорий, то приходиться прописывать условие и цикл для каждой директории, Речь идёт о директориях, находящихся в папке, описываемой в set BackUp=MyDisk:\MyBackUp, судя по организации цикла 'dir /ad /b /o-d вложенные директории не анализируются? Почему бы не написать нечто подобное: @Echo Off Do Call :SubRoutine "C:\Program Files" Do Call :SubRoutine "C:\Windows" GoTo :Eof :SubRoutine Set Num=10 Pushd %1 Echo --------------------------------------------------->>%~dpn0.log Echo %1>>%~dpn0.log Echo --------------------------------------------------->>%~dpn0.log For /F "usebackq delims=" %%d in (`Dir /b /A:D /O:-D`) Do Call :Proceed "%%d" Popd GoTo :Eof :Proceed Set /A Num-=1 If %Num% GEQ 0 GoTo :Eof Echo %Date% %Time%: Erase %1>>%~dpn0.log rem rd /s /q %1 2>nul >nul @Echo Off For %%i In ("C:\Program Files" "C:\Windows") Do Call :SubRoutine %%i GoTo :Eof Далее подпрограммы взять из предыдущего кода 3. Как понять: но оставляя всегда нужное фиксированное количество резерва - в чем резерв измеряется? Похоже, вы удаляете 10 старых директорий и иначе их никак не анализируете. |
------- Последний раз редактировалось megaloman, 21-12-2011 в 20:41. Отправлено: 17:26, 21-12-2011 | #3 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата Sony777:
|
||
Отправлено: 19:35, 21-12-2011 | #4 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Я исправил свой ответ в соответствии с Вашими разъяснениями.
В батниках можно описать множество директорий то ли в цикле, то ли вызывая подпрограмму с именем конкретной директории в каждой строке. Вот vbs-скрипт, по действию аналогичный батнику NMax = 10 MyDirs = Array("E:\Dir1", _ "E:\Dir2", _ "E:\Dir3") LogFile = WScript.ScriptFullName + ".Log" NN = UBound(MyDirs) Set FSO = CreateObject("Scripting.fileSystemObject") Set FLog = FSO.OpenTextFile(LogFile, 8, True) FLog.WriteLine "==========================" FLog.WriteLine CStr(Date) + " " + CStr(Time) FLog.WriteLine "==========================" For i = 0 To NN FLog.WriteLine vbCrLf + MyDirs(i) Set F = FSO.GetFolder(MyDirs(i)) Set SubF = F.SubFolders NDir = SubF.Count - 1 ReDim dSub(NDir), nSub(NDir) j = 0 For Each Folder In SubF nSub(j) = MyDirs(i) + "\" + Folder.Name dSub(j) = Folder.DateLastModified j = j + 1 Next For j = 0 To NDir ' If j > NMax - 1 Then Exit For For k = j To NDir If dSub(j) < dSub(k) Then dd = dSub(j) dSub(j) = dSub(k) dSub(k) = dd nd = nSub(j) nSub(j) = nSub(k) nSub(k) = nd End If Next Next M = MyDirs(i) If NDir >= NMax Then For j = NMax To NDir M = M + vbCrLf + CStr(dSub(j)) + " " + nSub(j) FLog.WriteLine CStr(dSub(j)) + " " + nSub(j) ' FSO.DeleteFolder nSub(j), True Next End If ' MsgBox M Next FLog.WriteLine vbCrLf FLog.Close ' FSO.DeleteFolder nSub(j), True Для реальной работы удалите в этой строке ' |
|
------- Отправлено: 20:46, 21-12-2011 | #5 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать megaloman, благодарочка! Сейчас тестирую.
|
Отправлено: 12:52, 22-12-2011 | #6 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать В общем у себя на машине локально протестировав, можно сказать что скрипт работает. Но на сервере в шедуллере он запускается, висит в раннинг, но ничего не происходит. :\
|
Отправлено: 16:59, 23-12-2011 | #7 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
2.Загвоздка была таки в учетках))) Сейчас поковырявшись стало все ок. Скрипт работает и удаляет быстро. Все пока хорошо. Спасибо вам большое) |
|
Отправлено: 12:13, 25-12-2011 | #8 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Прошу помочь с такой задачей: на N дисках в директориях вида _Dir_ (одинаковых на всех N дисках) есть архив состоящий из папок с названиями типа YYMMDD (год месяц день, например 120525). Стоит задача хранить архивы не менее 300 дней. Проблема состоит в том, что программа, создающая эти папки может создать папки с одинаковыми названиями одновременно на разных дисках. Естественно, удалять желательно все папки данного дня, т.е. считать x папок на x дисках как одну, если у них одинаковое имя.
Можно ли научить вышеприведенный скрипт выполнять такую задачу? Кстати, если в данном скрипте в строке: dSub(j) = Folder.DateLastModified заменить на dSub(j) = Folder.Name то скрипт замечательно удаляет именно самые старые папки. Буде очень признателен за помощь. |
Отправлено: 22:25, 25-05-2012 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата sv_ua:
|
|
Отправлено: 23:28, 26-05-2012 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Удаление папки по дате | Obnin | Скриптовые языки администрирования Windows | 8 | 14-12-2011 13:21 | |
CMD/BAT - [решено] Создание папок по дате получения файлов и перемещение в них файлов | KamikadZZe | Скриптовые языки администрирования Windows | 1 | 01-09-2011 14:15 | |
Любой язык - [решено] Вывод списка файлов и их размеров в байтах из заданной папки | Vadikan | Скриптовые языки администрирования Windows | 6 | 18-03-2011 23:16 | |
CMD/BAT - Удаление файлов по дате | ADGJMPTW | Скриптовые языки администрирования Windows | 1 | 10-10-2010 20:08 | |
Разное - Проблема с переносом файлов больших размеров на плеер | The_Berzerker | Накопители (SSD, HDD, USB Flash) | 2 | 01-07-2010 07:45 |
|