PDA

Показать полную графическую версию : [решено] Удаление папок меньше заданного размера


DOCznet
28-11-2013, 18:24
Из-за совсем поверхностных знаний скриптовых инструментов гугл меня не привел к нужному результату.

тот же diruse может выводить только папки больше заданного размера, его я сразу отмел.

В одной из тем на этом форуме было это:

SetLocal enabledelayedexpansion
Set DirProg=c:\dirname

For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S /A:-D') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Echo !dirsize!
Pause>nul

Но этот скрипт промеряет каждую папку на нефиксированной глубине, что не нужно

Следующий скрипт показался мне наиболее подходящим для докручивания:

DirName = "c:\dirname"

' DirName = "" ' Если скрипт в исследуемой папке и не хочется указывать к ней путь

If Len(DirName)=0 Then DirName=Replace(WScript.ScriptFullName,WScript.ScriptName,"")

WhereOut = DirName + "SizeSubDir.inf"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folders = FSO.GetFolder(DirName).SubFolders

Out = ""

For Each Folder In Folders

On Error Resume Next
FolderSize = CStr(Round(Folder.Size / 1024 / 1024,2))

If Err.Number <> 0 Then FolderSize = "Не определено"
FolderSize = Right(" " + FolderSize, 14)

Out = Out + FolderSize + " " + Folder.Name + vbCrLf ' Если не надо имена, удалить +" "+Folder.Name
Next

Set F = FSO.OpenTextFile(WhereOut, 2, True)
F.Write Out
F.Close


Может кто-нибудь "допилить" его?

-Интересуют только размер каждой из подпапок заданного каталога, без вычислений объемов каждой из дочерних подпапок
-нет необходимости выводить результат работы скрипта в текстовый файл
-условие для удаления - "больше заданного размера"

Iska
28-11-2013, 18:50
Примерно так:
Option Explicit

Dim strFolder
Dim lngSize

Dim objFolder


strFolder = "E:\Песочница\0331"
lngSize = 50 * 2^10

With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strFolder) Then
For Each objFolder In .GetFolder(strFolder).SubFolders
If objFolder.Size < lngSize Then
WScript.Echo "[" & objFolder.Path & "] deleting..."
'objFolder.Delete True
Else
WScript.Echo "[" & objFolder.Path & "]"
End If
Next
Else
WScript.Echo "Folder [" & strFolder & "] not found."
End If
End With

WScript.Quit 0

Укажите свой размер в «lngSize» вместо выделенного. Для реального удаления раскомментируйте выделенную строку.

DOCznet
28-11-2013, 21:09
Большое спасибо, только можно ли еще добавить игнорирование ошибок прав доступа, что бы скрипт считал след. объекты?

yurfed
28-11-2013, 21:32
Iska, к делу не относится, просто интересно стало. Почему 10^2, а не 1024?

Iska
29-11-2013, 00:44
Почему 10^2, а не 1024? »
Запомнить проще. «1024» я, конечно, помню, а вот уже сколько занимают мегабайт и гигабайт — наизусть нет. Посему — так, степенями. Только не 10^2, 2^10 ;).

Большое спасибо, только можно ли еще добавить игнорирование ошибок прав доступа, что бы скрипт считал след. объекты? »
А какой в этом смысл — сравнение ведь тогда будет некорректно. Кстати, откуда там «ошибки прав доступа» возникают?

DOCznet
02-12-2013, 04:05
Цитата Iska:
А какой в этом смысл — сравнение ведь тогда будет некорректно. Кстати, откуда там «ошибки прав доступа» возникают? »

По задумке скрипт должен работать в C:\Users и доделывать дела кривой политики MS удаления неиспользуемых профилей старше N дней, которая после себя оставляет каждый раз разные папки в APPDATA у разных пользователей (большей их части), в которых либо файлов на пару килобайт, либо просто пустые каталоги. Соответственно если пользователю по разным стечениям обстоятельств доводится вновь работать на этой машине, то папка профиля создается вида USERNAME.DOMAINNAME, USERNAME.DOMAINNAME.001 etc. что сбивает некоторые привязки в рабочих программах и создает дополнительные трудозатраты. При том, что проблемы доступа возникают только с "живыми" профилями - игнорирование ошибок прав доступа еще и ускорит отработку.

P.S. не думал, что даже из под учетной записи ПК, которая выполняет логон сценарии, будет нечто подобное

Iska
02-12-2013, 05:19
Ясно. Не пробовали стороннее средство: Delprof2 - User Profile Deletion Tool • Helge Klein (http://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/)?

Тогда как-то так (не проверялось):
Option Explicit

Dim strFolder
Dim lngSize

Dim objFolder


strFolder = "E:\Песочница\0331"
lngSize = 50 * 2^10

With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strFolder) Then
On Error Resume Next

For Each objFolder In .GetFolder(strFolder).SubFolders
If objFolder.Size < lngSize Then
If Err.Number = 0 Then
objFolder.Delete True

If Err.Number = 0 Then
WScript.Echo "[" & objFolder.Path & "] deleting..."
Else
Err.Clear
WScript.Echo "Error while deleting [" & objFolder.Path & "]."
End If
Else
Err.Clear
End If
Else
'WScript.Echo "[" & objFolder.Path & "]"
End If
Next

On Error Goto 0
Else
WScript.Echo "Folder [" & strFolder & "] not found."
End If
End With

WScript.Quit 0

DOCznet
02-12-2013, 23:27
То что доктор прописал.

Спасибо большое!




© OSzone.net 2001-2012