Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление папок меньше заданного размера (http://forum.oszone.net/showthread.php?t=272984)

DOCznet 28-11-2013 18:24 2263241

Удаление папок меньше заданного размера
 
Из-за совсем поверхностных знаний скриптовых инструментов гугл меня не привел к нужному результату.

тот же 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 2263250

Примерно так:
Код:

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 2263336

Большое спасибо, только можно ли еще добавить игнорирование ошибок прав доступа, что бы скрипт считал след. объекты?

yurfed 28-11-2013 21:32 2263340

Iska, к делу не относится, просто интересно стало. Почему 10^2, а не 1024?

Iska 29-11-2013 00:44 2263442

Цитата:

Цитата yurfed
Почему 10^2, а не 1024? »

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

Цитата:

Цитата DOCznet
Большое спасибо, только можно ли еще добавить игнорирование ошибок прав доступа, что бы скрипт считал след. объекты? »

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

DOCznet 02-12-2013 04:05 2265285

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

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

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

Iska 02-12-2013 05:19 2265307

Ясно. Не пробовали стороннее средство: Delprof2 - User Profile Deletion Tool • Helge Klein?

Тогда как-то так (не проверялось):
читать дальше »
Код:

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 2265766

То что доктор прописал.

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


Время: 20:21.

Время: 20:21.
© OSzone.net 2001-