28 марта 2024, 22:37

Цитата дня:

Измеряй микрометром. Отмечай мелом. Отрубай топором. Правило точности Рэя


bat-файл для очистки временных файлов и ПАПОК

Автор STALKER_SLX, 25 декабря 2018, 12:03

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

STALKER_SLX

Доброго времени суток, уважаемые форумчане!
Тема данного вопроса уже многократно избита на просторах Интернета, но очень бы хотелось услышать мнение опытных практикующих админов!

Нашел простенький батник (назовём его «del_tmp.bat») со следующим содержимым:
@echo OFF
del %Temp%\*.* /S /F /Q
del c:\windows\temp\*.* /S /F /Q
echo Vse vremennyie fayly udaleny
pause
@echo ON


Данный скрипт хорошо справляется с удалением временных файлов в профиле пользователя и чистит c:\windows\temp. Но есть одно «Но» - он удаляет только лишь файлы!

1. В связи с чем вопрос: какие строки нужно добавить в указанный bat-файл, чтобы он удалял и ПАПКИ по указанных путях?!

2. Если есть у кого-то скрипт получше - прошу поделится!

3. Будет такой скрипт нормально выполняться на продакшин серверах ( сам пока еще не тестировал) ?! Или нужно что-то иное применять?!

ival

Remove-Item %Temp%\* -recurse -force
Remove-Item C:\windows\temp\* -recurse -force

Я бы так делал


STALKER_SLX

Remove-Item %Temp%\* -recurse -force
Remove-Item C:\windows\temp\* -recurse -force

Я бы так делал
Я так понимаю, что эти строки нужно запускать в оболочке PowerShell?!
А если нужно на нескольких десятках (или больше) машин запускать, то выходит довольно таки хлопотно…

Хотелось бы получить более универсальный скрипт, который можно будет запускать каждый раз при старте ОС или в планировщике заданий в нужное время.

ival

Не совсем понятно, чем запуск ps отличается от запуска cmd? Ps достаточно универсальный и гибкий инструмент, в отличие от командной строки, которая прямолинейна и убога. Он не подойдет если только у вас xp, во всех остальных случаях от cmd лучше вообще отказаться.

Уваров А.С.

Вопрос только - зачем? Если почистить диск - есть штатные механизмы, а если дисковое не поджимает, то лежит оно там и пусть лежит. Разве что за какой программной целенаправленно убираться.

STALKER_SLX

Спасибо ВСЕМ откликнувшимся за помощь!
Данную задачу решил следующим образом - к указанным выше строкам добавил еще парочку (которые как раз таки отвечают за удаление ПАПОК, по заданным путям):
SET Path2Del=C:\Windows\Temp\
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
SET Path2Del=%Temp%\
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")


В итоге вся конструкция теперь выглядит так:
@echo off
del %Temp%\*.* /S /F /Q
del C:\Windows\Temp\*.* /S /F /Q
SET Path2Del=C:\Windows\Temp\
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
SET Path2Del=%Temp%\
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
echo Vse vremennyie faylyi i papki udaleny
pause
@echo ON



Если кому- то в будущем понадобиться такой файлик, то прикрепляю его в архиве «del_tmp_files_&_folders.zip»


P.S.: Я начинающий админ и пока не силён в «языках», в т.ч. и PowerShell, но буду стараться заполнить этот пробел :)
Как только появиться немного времени попробую еще погуглить, чтобы решить эту же задачу более элегантно и универсально, но средствами самого PowerShell!

ival

Вы молодец, что начали разбираться и достигли результата. Но всё-таки посмотрите на мои 2 строчки и на свои много строк)) забудьте cmd и начните все-таки использовать ps.

Уваров А.С.

PS безусловно мощная вещь, но вымораживает в нем одно - синтаксис.

Как средство автоматизации посредством скриптов - ОК, все равно скрипты пишутся в IDE, а там и подсветка, и автодополнение, и прочие плюшки. Но как средство администрирования PS вызывает только глухое раздражение. Мое мнение: его писали программисты и для программистов.

Другое дело bash - лаконичен и универсален.

ival

PS безусловно мощная вещь, но вымораживает в нем одно - синтаксис.

Как средство автоматизации посредством скриптов - ОК, все равно скрипты пишутся в IDE, а там и подсветка, и автодополнение, и прочие плюшки. Но как средство администрирования PS вызывает только глухое раздражение. Мое мнение: его писали программисты и для программистов.

Другое дело bash - лаконичен и универсален.
Соглашусь, что с первого взгляда он очень нелогичен, плюс командлеты есть пересекающиеся, плюс много не явных команд. Но других вариантов нет. Думаю в скором приближении им придётся пользоваться всегда, т.к. относительно недавно MS начала продвигать свой бесплатный продукт windows admin center. Скорее всего они хотят перевести людей на core, а GUI оставить как дополнение. На wac я бегло посмотрел и пришёл к выводу, что базово им можно пользоваться, но что-то не тривиальное придётся делать через ps.

STALKER_SLX

Remove-Item %Temp%\* -recurse -force

указанная Вами команда не срабатывает!

Немного погуглив, я узнал, что команда для очистки временных папок текущего профиля пользователя имеет следующий вид:
Remove-Item $env:temp\* -Recurse -Force


То есть для очистки временных файлов и папок (не трогая родительскую папку) с помощью PowerShell, нужно вписать две строки:
Remove-Item C:\Windows\Temp\* -Recurse -Force
Remove-Item $env:temp\* -Recurse -Force


ival

Возможно, к сожалению я не знаю всех переменных окружения, особенно переменными которыми никогда не пользуюсь. Ну например есть переменная $env:computername и есть переменная hostname одно и тоже, но разница в количестве символов на лицо. Собственно к $env я вообще обращался очень редко.

STALKER_SLX

Выражаю свою большую благодарность ival за помощь и корректировку направления моих мыслей :)

Ранее, в процессе решения данного вопроса, на просторах сети наткнулся на очень любопытную статью:
«Автоматическое удаление старых файлов [скрипт PowerShell]»
https://www.mytechnote.ru/article/avtomaticheskoe-udalenie-staryh-faylov-skript-powershell

Там автор еще более изящно чистит файлы и папки, учитывая их возраст (дату создания).

Может кому-то в будущем будет в самый раз, например, для чистки определённых папок на терминальном сервере.

С позволения уважаемой администрации форума приведу содержимое всего PS-скрипта и пояснения автора тут (вдруг исчезнет та статься) с уже внесенной моей поправкой на пути к папкам, которые будем чистить - "C:\Windows\Temp\" и "C:\Users\имя_текущего_пользователя\Appdata\Local\Temp" (в скрипте это выглядит как "$env:temp\")


В этом блоке указываем количество дней (в данном случае это - 7 дней), файлы старше которых должны быть удалены, задаем путь до очищаемой папки/папок (пути к нужным папкам пишутся в кавычках и разделяются между собой запятой + пробел) и желаемые расширения файлов.
Если вам нужно удалять определенные типы файлов, например можно задать "*.js" - тогда будут удалены все старые JavaScript файлы.
$Days = "7"
$TargetFolder = "C:\Windows\Temp\", "$env:temp\"
$Extension = "*"


В следующем участке мы находим все файлы, которые подходят под наши критерии. А также сортируем список, что бы всё шло от большего пути к меньшему. Это нужно, если у вас будут вложенные папки, что бы скрипт всегда сперва удалял файлы, а потом уже пытался удалить папку, где расположены эти папки.
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName


Собственно, удаляем файл.
foreach ($File in $Files)
{
 if ($File -ne $NULL -and !$File.PSIsContainer)
 {
  write-host "Deleting File $File" -ForegroundColor "Magenta"
  Remove-Item $File.FullName -Force | out-null
 }


Тут мы удаляем папку, но перед ее удалением, проверяем, что бы она была пустая.
elseif ($File -ne $NULL -and $File.PSIsContainer)
 {
                               $FolderInfo = get-Childitem $File.FullName | Measure-Object
                               if ($folderInfo.count -eq 0)
                               {
                                               write-host "Deleting directory - $File" -foregroundcolor "green"
                                               Remove-Item $File.FullName -Force | out-null
                               }
 }


По сути, это повторение уже проделанной операции. Но тут мы проходимся по всем папкам, ищем пустые папки и удаляем их.
$folderInfo=""
 $Folders = Get-Childitem $TargetFolder -Recurse | Where{$_.PSIsContainer} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
 foreach ($Folder in $Folders)
 {
                if ($Folder -ne $null)
                {
                               $FolderInfo = get-Childitem $Folder.FullName | Measure-Object
                               if ($folderInfo.count -eq 0)
                               {
                                               write-host "Deleting directory - $Folder" -foregroundcolor "yellow"
                                               Remove-Item $Folder.FullName -force | out-null
                               }
                }
 }



Работоспособность указанного скрипта проверено лично мной. Со своей задачей он справляется без проблем.


Также в архиве «delete-old-files.zip», прикрепленном к этому сообщению, находится уже модифицированный PS-скрипт для чистки указанных выше папок:
"C:\Windows\Temp\" и "C:\Users\имя_текущего_пользователя\Appdata\Local\Temp".

Если кому-то нужно чистить другие папки - просто замените пути на свои в "$TargetFolder =".


Вверх