Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Удаление папок меньше заданного размера

Ответить
Настройки темы
Любой язык - [решено] Удаление папок меньше заданного размера

Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

тот же 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
Может кто-нибудь "допилить" его?

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

Отправлено: 18:24, 28-11-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Примерно так:
Код: Выделить весь код
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» вместо выделенного. Для реального удаления раскомментируйте выделенную строку.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:50, 28-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:09, 28-11-2013 | #3


Аватара для yurfed

Ветеран


Сообщения: 20133
Благодарности: 3145

Профиль | Отправить PM | Цитировать


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

-------
Хочу ли я - Могу ли я - Говно ли я - Магнолия


Отправлено: 21:32, 28-11-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 00:44, 29-11-2013 | #5


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 04:05, 02-12-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Ясно. Не пробовали стороннее средство: 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:19, 02-12-2013 | #7


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 23:27, 02-12-2013 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Удаление папок меньше заданного размера

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочие - [решено] Удаление файлов заданного расширения Папуас Программное обеспечение Windows 11 25-02-2019 15:04
Интерфейс - Автоматическое назначение заданного шаблона отображения папок для группы папок 19w85 Microsoft Windows 7 8 08-08-2012 01:02
VBS/WSH/JS - [решено] Удаление файлов меньше определенного размера XXXp Скриптовые языки администрирования Windows 19 03-05-2012 15:12
Прочие - Программа (скрипт) удаление из заданного каталога заданных файлов __sa__nya Программное обеспечение Windows 1 20-11-2008 19:02
Размера меньше пользы больше d0c Microsoft Windows 95/98/Me (архив) 3 07-11-2002 19:14




 
Переход