Как вы удаляете временные файлы? Вручную запускаете CCleaner или аналогичную программу, либо настроили ее запуск по расписанию? Я обхожусь встроенными средствами Windows, причем все сводится буквально к одной команде. Я хочу поделиться с вами двумя скриптами, которые давно служат мне верой и правдой для удаления ненужных файлов.
В Windows есть утилита для очистки диска, которую можно настроить для удаления заданных категорий файлов по расписанию. Она легко справится с очисткой временных файлов из расположений, известных системе, но не позволит удалять ненужные файлы из заданной вами папки. С помощью скриптов можно очищать не только временные файлы, но и любую папку. Например, я удаляю файлы из папок Test и Temp, которые служат для экспериментов и временного хранения файлов как в загрузках, так и документах.
В отличие от программных чистильщиков, скрипты можно гибко настроить, а регулярность выполнения очистки легко реализовать с помощью планировщика заданий Windows.
Эти скрипты позволяют удалять только файлы заданного «возраста» вместо полной очистки папки.
В статье вы найдете примеры скриптов и рассказ о том, как настроить задачу в планировщике одной командой. Вы также сможете скачать готовые файлы и создать задание для очистки папок за пару минут.
Скрипты
Вы можете воспользоваться на выбор скриптами CMD, VBS и PowerShell.
CMD
Можно использовать утилиту командной строки forfiles.exe, входящую в состав Windows 7 и новее (когда-то она входила в Windows 2000 Resource Kit). Одной командой удаляются все файлы из указанной папки и вложенных в нее.
Команда для выполнения
forfiles.exe /p %temp% /s /m *.* /d -14 /c "cmd /c del /q /f @file"
- Вместо %temp% (временной папки в профиле) подставьте свою папку (параметр /p)
- Возраст файлов по умолчанию 14 дней (параметр /d), но вы можете задать любое значение
- Можно удалять файлы определенного расширения по маске (например, /m *.log)
- За рекурсивное удаление (во вложенных папках) отвечает параметр /s
Конечно, в скрипте вы можете использовать несколько команд, каждая из которых будет удалять заданную папку. Справка по использованию утилиты вызывается командой forfiles /?.
VBS
Приведенный ниже скрипт VBS удаляет все файлы и папки, включая защищенные, с выводом списка удаленных файлов.
On Error Resume Next intDays = Int(Wscript.arguments.Item(0)) strFldr = Wscript.arguments.Item(1) Set objFSO = CreateObject("Scripting.FileSystemObject") DelOld strFldr, intDays Function DelOld(sFldr, iDays) On Error Resume Next Dim oD, cF, cD, oI Set oD = objFSO.GetFolder(sFldr) Set cF = oD.Files Set cD = oD.SubFolders For Each oI In cF If DateDiff("d", oI.DateLastModified, Now) > iDays Then WScript.Echo oI.Path oI.Attributes = 0 oI.Delete End If Next For Each oI In cD DelOld oI.Path, iDays If oI.Size = 0 Then oI.Attributes = 0 oI.Delete End If Next End Function
- Файлы удаляются по дате изменения. Чтобы удалять по дате создания, замените .DateLastModified на .DateCreated
- Если не хотите удалять защищенные файлы, закомментируйте строку
‘ oI.Attributes = 0
Команда для выполнения
Скрипт можно запускать из командного файла (CMD).
cscript //Nologo MyCleanUp.VBS 14 %windir%\temp >MyCleanupScript.Log
- Вместо %windir%\temp подставьте свою папку (в этом примере удаляются файлы из временной папки в системном каталоге)
- Возраст файлов по умолчанию 14 дней, но вы можете задать любое значение
- Список удаленных файлов будет по умолчанию сохранен в файле %windir%\system32\MyCleanupScript.Log, хотя можно указать любой путь и имя файла
Как и в случае с утилитой forefiles.exe, можно реализовать очистку различных папок, указав каждую в отдельной команде.
PowerShell
Скрипт на PowerShell был в блоге Сергея Мариничева в рамках урока об операциях с файлами, но теперь страница доступна только в архиве интернета. Я скопировал ключевое содержимое для вас:
#из заданной папки удалять все файлы и папки старше 14 дней $Path = "C:\temp" $Days = "-14" $CurrentDate = Get-Date $OldDate = $CurrentDate.AddDays($Days) Get-ChildItem $Path -Recurse | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
Запуск скрипта:
powershell.exe -ExecutionPolicy Bypass -noprofile -file Script.ps1
Выполнение очистки по расписанию
Для выполнения очистки папки по расписанию нужно создать скрипт с именем cleanup.cmd, содержащий команду для запуска, и скопировать его в любую папку из PATH (например, %windir%\system32). Поместите туда же скрипт VBS или PowerShell, если вы решили использовать его, а не утилиту forfiles.ехе.
Задание в планировщике создается одной командой:
Schtasks.exe /Create /RL Highest /TN CleanUP /SC Weekly /D SUN /ST 14:00 /TR "%WINDIR%\system32\cleanup.cmd"
Задание с именем CleanUp будет выполняться:
- с наивысшими правами (параметр /RL)
- раз в неделю (параметр /SC)
- по воскресеньям (параметр /D)
- в 14:00 (параметр /ST)
Откройте Пуск – Поиск – Планировщик заданий и вы увидите в библиотеке планировщика задание CleanUp.
Можете проверить работу задания в планировщике. Для этого щелкните правой кнопкой мыши по заданию и выберите Выполнить.
Готовые файлы
Загрузите архив и распакуйте в любую папку. В архиве варианты forfiles и VBS.
- Задайте путь к папке и возраст файлов в скрипте CleanUp.cmd в одной из папок (каждая соответствует одному из описанных выше способов), после чего скопируйте все содержимое папки в %windir%\system32.
- Щелкните правой кнопкой мыши на файле schedule.cmd и выберите Запуск от имени администратора, чтобы создать задание.
Благодарности
Авторами скриптов, которые я когда-то почерпнул из этой темы конференции OSZone, являются Keeper2006 и amel27 соответственно. В этой же теме вы найдете другие интересные варианты решения данной задачи, и туда же следует направлять вопросы по доработке скриптов под свои нужды.
А как вы избавляетесь от ненужных файлов – программой или скриптом? Настроена ли у вас очистка по расписанию?
Сергей
Vadim Sterkin,
Вадим, этот вопрос я задавал больше года назад.
Андрей СОВА
Спасибо за скрипт, очень нужно, я всегда чистил папки через cmd файл, но это не удобно совсем VBS ваш мне в помошь!!!! Спасибо!!!!
Galer
Для встроенного средства очистки дисков можно создать свои правила http://msdn.microsoft.com/en-us/library/bb776782(v=vs.85).aspx .
Rainman
Посмотрел я на этот ужас, и так не понял — будет ли это работать в Windows 8 и Windows 8.1, ибо там вроде как нет менеджера очистки. Помимо этого, при быстром прочтении, совсем не очевидно как сделать GUID, да и готовых батников или рег файлов для выполнения операции целиком там нет.
Rainman
p.s: и да, есть ещё одна проблема — батник можно сделать универсальным для 1000 машин с разным набором софта, если какой то софтины не будет, то просто ничего не произойдёт, а если это всё делать через реестр то обновлять эти правила, и бороться с проблемами мёртвых GUID придётся очень серьёзно.
Vadim Sterkin
Не понимаю, что вам привиделось, и вообще статья не о cleanmgr.
Vadim Sterkin
Есть, cleanmgr
Александр [Маздайщик]
Обычно не беспокоюсь об объёме временных файлов. Время от времени или по окказии запускаю утилиту «Очистка диска», либо по той же окказии залазаю в папку %TEMP% (залез в AppData, почему бы не залезть и в Temp) и там удаляю файлы вручную.
Беспокойство о временной папке чем-то напоминает беспокойство о «лишних» ключах реестра, чисткой которых, как писалось в этом блоге, часто убивают Винду.
Rainman
К сожалению команда:
работает только в 32х битной версии Windows 7 :( на x64 задание добавляется, но данный файл почему то не находится.
Vadim Sterkin
Файл либо есть, либо нет. Консоль запускайте так, файл копируйте в проводнике, а не 32-разрядном тоталкоммандере своем.
Pupkin
Привет, Вадим! Ещё во времён 9х систем использую следующий метод удаления временных файлов:
1. Меняю пути для переменных окружения %temp% и %tmp% на %SystemDrive%\Temp
2. Кладу в %SystemDrive% файл temprem.cmd следующего содержания:
и ставлю на него атрибуты скрытый системный только чтение
3. Создаю задачу в планировщике с правами системы запускать файл при старте компьютера
Естесственно, что в 9х это запускалось по-другому, да и батник был другой. Понимаю, что при выходе из гибернации папка не очищается, но рано или поздно комп всё равно ребутнут )
Vadim Sterkin
Способ не нов, но… у вас на ПК никогда больше одного пользователя не было? %temp% же у каждого свой, а там разное бывает. Да и задача явно не настолько приоритетна, чтобы выполнять ее при старте.
Pupkin
Тогда придется каждому юзеру менять путь к %temp% на %SystemDrive%\Temp . Иначе этот фокус не сработает. Я же не только юзерские пути к темпам меняю, но и системные (%windir%\temp) и удаление временных файлов происходит до входа пользователя в систему. И задача шедулится от имени системы.
В том-то и дело, что приоритетна. Чтобы не мучаться с вложенными папками в %temp%, коммандный файл просто удаляет папку Temp со всем содержимым и создаёт её заново. Это происходит до входя пользователя в систему. Как только пользователь войдёт в систему — в %temp% могут появиться рабочие файлы, например от антивируса, и ось не даст нам удалить папку.
Впрчем — забейте! Выше были описаны рабочие варианты решения данной проблемы. Кто меня за язык тянул )))
Мдя, невнимательно я читал комменты. В самом начале описан почти такой-же способ. Только там скорее всего удаляются не все файлы в %temp%. В моём случае удаляются все файлы. И ещё, по-поводу почему при включении? Наверное это дело привычки — всё это начиналось ещё в Win9x. А там нормального планировщика не было. Поэтому запускался батник либо из автоэкзэка, либо создавался ярлык в автозагрузке. Врочем и менять пути к %temp% — тоже привычка. Раньше русская Win2k глючила с длинными путями в которых были русские слова. Один из методов лечения как раз состоял в том, чтобы перенести папку Temp в корень системного диска.
Vadim Sterkin
Угу, и каждый пользователь будет иметь доступ к временным файлам другого пользователя. Хорошего в этом ничего нет.
Я предпочитаю не тратить время на эту возню, а при нбх добавить папку в свой скрипт.
Вообще, антивирус загружается до выполнения вашего командного файла, но мысль понятна. Вот поэтому в моих скриптах и разбирается отсечка по времени — удаляются файлы старше N дней, которые точно не заняты. А в планировщик это ставится на бездействие -> нет негативного влияния на время запуска ОС.
Pupkin
В апинципе и здесь можно прописать папки Temp всех юзеров системы и очищать их все при загрузке. И не править переменные окружения.Только вот в системных переменных их прописать не получится. Придётся использовать абсолютные пути. Ибо когда выполняется скрипт — %temp%=%windir%\temp. А нам же нужно почистить временные папки пользователей.
Ну я же не возражаю )))
Предлагаю закончить обсуждение — ибо всё понятно и нечего переливать из пустого в порожнее. Говорю-же — зря я вообще влез.
Удачи!
Аркадий
Отличный скрипт!! Взял на вооружение. Только вот вопросы. Удаляются временные файлы из programdata и из временных папок пользователя?
Vadim Sterkin
Аркадий, какие папки укажете….
psi-x
файл CleanUp.cmd с папки VBS изменил таким образом чтоб он удалял недавние документы в windows xp (так как у меня их там более 400) и оставлял только не старее 2 дней
и ничего не получилось.
Почему?
Vadim Sterkin
Обратитесь в форум, плиз.
psi-x
какой форум? Я сюда обращался http://forum.oszone.net/thread-147846-2.html но в принципе в комах к этой записи нашлось решение
работает ))
Vadim Sterkin
С любыми вопросами по скриптам из этой записи обращайтесь в эту тему OSZone.