|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] WSH скрипт для удаления файлов (логика скрипта внутри) |
|
|
VBS/WSH/JS - [решено] WSH скрипт для удаления файлов (логика скрипта внутри)
|
Новый участник Сообщения: 14 |
Профиль | Отправить PM | Цитировать
Есть скрипт для удаления пустых папок (взял из соседней темы)
strFldr = Wscript.arguments.Item(0) Dim oD, cD, oI Set objFSO = CreateObject("Scripting.FileSystemObject") DelBlank strFldr Sub DelBlank(sFldr) Set oD = objFSO.GetFolder(sFldr) Set cD = oD.SubFolders For Each oI In cD DelBlank oI.Path Next If oD.Size = 0 Then wscript.echo OD + " - Folder delete" oD.Attributes = 0 oD.Delete else wscript.echo OD + " - Folder is no Empty" End If End Sub Логика скрипта на WSH такая: 1 - Нужен скрипт, который будет удалять файлы по маске (т.е. определенные типы файлы, которые занесены к примеру в тот же test.txt); 2 - Нужно задавать исключения на папки, которые будет пропускать (те же Windows, Programm Files и т.д., чтобы не стереть лишнее); 3 - Если файл занят - он его пропускает и движется дальше; 4 - Ну соответственно, если папки пустые - он их тоже удаляет; 5 - и последнее, чтобы он не трогал подключаемые диски (флешки, сетевые диски), а работал только с локальными (т.е. у которых значение DriveType==2 - это по-моему обозначение как раз-таки локальных); Немного покопавшись в книгах нашел пару записей, к примеру по пункту 2, вот есть "Выполнение программа для всех подпапок": Sub GoSubFolder (objDIR) If objDIR <> "\System Volume Information" Then MainSub objDIR For Each eFolder in objDIR.SubFolders GoSubFolders eFolder Next End If End Sub Но прежде чем в какой-то папке выполнять он должен с ней соединиться, и получается вот такой код: Function GetFolder(sFOLDER) On Error Resume Next Set GetFolder = FSO.GetFolder(sFOLDER) If Err.Number <> 0 Then Wscript.Echo "Error connecting to folder:" & sFOLDER & VBlf & "[" & Err.Number & "]" & Err.Description Wscript.Quit Err.Number End If End Function Sub DelFile(sFILE) On Error Resume Next FSO.Delete File sFILE, True If Err.Number <> 0 Then Wscript.Echo "Error deleting file: " & sFILE End If End sub Вот чтобы удалить все файлы определенного типа, нужно выполнить: Set FSO = CreateObject("Scripting.FileSystemObject") sDIR = "directory" sEXT = "EXT" Set objDIR = GetFolder(sDIR) GoSubFolders objDIR Sub MainSub (objDIR) For Each efile in obj.DIR.Files fEXT = FSO.GetExtensionName(efile.Path) If LCase(fEXT) = LCase(sEXT) Then DelFile efile End If Next End sub Получается чтобы скрипт нормально работал нужно, сначала написать GoSubFolder , потом GetFolder, потом DelFile и после этого уже "Определение конкретного типа", но у меня не получается соединить это воедино, чтобы оно нормально работало, все время вылезает какая-нибудь ошибка и не получается разобраться с пунктами 3 и 5 Может у кого, есть уже подобные скрипты. Буду рад любой помощи. |
|
Отправлено: 16:10, 13-05-2010 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Francyz, п.1-4 (шаблоны файлов/папок задаются регулярными выражениями):
sFldr = Wscript.Arguments.Item(0) ' Шаблоны удаляемых файлов ' ------------------------ cInclFiles = Array( _ "\\~\$[^\\]+$", _ "\.(BAK|TMP|TEMP)$") ' Шаблоны пропускаемых каталогов ' ------------------------------ cExclFolders = Array( _ "^.:\\Documents and Settings$", _ "^.:\\Program Files$", _ "^.:\\System Volume Information$", _ "^.:\\WINDOWS$" ) ' Компиляция шаблонов ' ------------------- RegExpComp cInclFiles RegExpComp cExclFolders Set objFSO = CreateObject("Scripting.FileSystemObject") ClearDir sFldr, cInclFiles, cExclFolders Sub ClearDir(sFldr, cIncl, cExcl) On Error Resume Next Dim oD, cF, cD, oI, iR For iR=0 To UBound(cExcl) If cExcl(iR).Test(sFldr) Then Exit Sub Next Set oD = objFSO.GetFolder(sFldr) Set cF = oD.Files Set cD = oD.SubFolders For Each oI In cF For iR=0 To UBound(cIncl) If cIncl(iR).Test(oI.Path) Then WScript.Echo "File : " & oI.Path oI.Attributes = 0 oI.Delete Exit For End If Next Next For Each oI In cD ClearDir oI.Path, cIncl, cExcl Next If oD.Size >0 Then Exit Sub WScript.Echo "Folder: " & oD.Path oD.Attributes = 0 oD.Delete End Sub Sub RegExpComp(aReg) Dim iReg, sReg For iReg=0 To UBound(aReg) sReg = aReg(iReg) Set aReg(iReg) = CreateObject("VBScript.RegExp") aReg(iReg).Pattern = sReg aReg(iReg).IgnoreCase = True Next End Sub |
Отправлено: 11:45, 14-05-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать amel27, Большое спасибо, по поводу 5-го пункта есть вот такое условие:
For Each objDrive In objFSO.Drives ' Перебираем все существующие тома. If objDrive.DriveType = 2 Then ' Том фиксированный? If objDrive.IsReady Then ' Том готов? WScript.Echo "Find on drive " & objDrive.DriveLetter & ":..." ' выдаем найденные диски End If End if Next Можете подсказать, в каком месте его соединить с предложенным вами скриптом, чтобы убрать sFldr = Wscript.Arguments.Item(0) и я бы не вводил в CMD команду "Cscript testdel.vbs c:\", а просто ввел "Cscript testdel.vbs" и он уже тогда бы просканировал все найденные диски сам. |
Отправлено: 15:07, 14-05-2010 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать |
Отправлено: 16:06, 14-05-2010 | #4 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать amel27, Спасибо, добавил указанное условие и удалил вначале строчку sFldr = Wscript.Arguments.Item(0), чтобы не указывать диск самому, но ничего не происходит. Скрипт выполняется без ошибок, но никаких действий нет, я так понял из-за того, что не заменили переменную sFldr в остальных местах.
В указанном условии: For Each objDrive In objFSO.Drives If objDrive.DriveType=2 And objDrive.IsReady Then ClearDir objDrive.DriveLetter, cInclFiles, cExclFolders End if Next было: ClearDir sFldr, cInclFiles, cExclFolders стало: ClearDir objDrive.DriveLetter, cInclFiles, cExclFolders Dim objDrive cInclFiles = Array( _ "\\~\$[^\\]+$", _ "\.(TXT|MP3)$") cExclFolders = Array( _ "^.:\\Documents and Settings$", _ "^.:\\Program Files$", _ "^.:\\System Volume Information$", _ "^.:\\WINDOWS$" ) RegExpComp cInclFiles RegExpComp cExclFolders Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objDrive In objFSO.Drives If objDrive.DriveType=2 And objDrive.IsReady Then ClearDir objDrive.DriveLetter, cInclFiles, cExclFolders End if Next Sub ClearDir(objDrive.DriveLetter, cIncl, cExcl) On Error Resume Next Dim oD, cF, cD, oI, iR For iR=0 To UBound(cExcl) If cExcl(iR).Test(objDrive.DriveLetter) Then Exit Sub Next Set oD = objFSO.GetFolder(objDrive.DriveLetter) Set cF = oD.Files Set cD = oD.SubFolders For Each oI In cF For iR=0 To UBound(cIncl) If cIncl(iR).Test(oI.Path) Then WScript.Echo "File : " & oI.Path oI.Attributes = 0 oI.Delete Exit For End If Next Next For Each oI In cD ClearDir oI.Path, cIncl, cExcl Next If oD.Size >0 Then Exit Sub WScript.Echo "Folder: " & oD.Path oD.Attributes = 0 oD.Delete End Sub Sub RegExpComp(aReg) Dim iReg, sReg For iReg=0 To UBound(aReg) sReg = aReg(iReg) Set aReg(iReg) = CreateObject("VBScript.RegExp") aReg(iReg).Pattern = sReg aReg(iReg).IgnoreCase = True Next End Sub |
|
Отправлено: 11:08, 15-05-2010 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Francyz:
cInclFiles = Array( _ "\\~\$[^\\]+$", _ "\.(TMP|BAK|TEMP)$") cExclFolders = Array( _ "^.:\\Documents and Settings$", _ "^.:\\Program Files$", _ "^.:\\System Volume Information$", _ "^.:\\WINDOWS$" ) RegExpComp cInclFiles RegExpComp cExclFolders Set oFSO = CreateObject("Scripting.FileSystemObject") For Each oDrive In oFSO.Drives If oDrive.DriveType=2 And oDrive.IsReady Then ClearDir oDrive.DriveLetter & ":", cInclFiles, cExclFolders End If Next Sub ClearDir(sFldr, cIncl, cExcl) On Error Resume Next Dim oD, cF, cD, oI, iR For iR=0 To UBound(cExcl) If cExcl(iR).Test(sFldr) Then Exit Sub Next Set oD = oFSO.GetFolder(sFldr) Set cF = oD.Files Set cD = oD.SubFolders For Each oI In cF For iR=0 To UBound(cIncl) If cIncl(iR).Test(oI.Path) Then WScript.Echo "File : " & oI.Path oI.Attributes = 0 oI.Delete Exit For End If Next Next For Each oI In cD ClearDir oI.Path, cIncl, cExcl Next If oD.Size >0 Then Exit Sub WScript.Echo "Folder: " & oD.Path oD.Attributes = 0 oD.Delete End Sub Sub RegExpComp(aReg) Dim iReg, sReg For iReg=0 To UBound(aReg) sReg = aReg(iReg) Set aReg(iReg) = CreateObject("VBScript.RegExp") aReg(iReg).Pattern = sReg aReg(iReg).IgnoreCase = True Next End Sub |
|
Отправлено: 13:16, 15-05-2010 | #6 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Большое спасибо, просто сбило с толку одинаковое название.
|
Отправлено: 15:00, 15-05-2010 | #7 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать У меня вот возник вопрос, а как можно в самих исключениях настройку сделать?
Вот добавлена папка "\\Documents and Settings$" ее трогать не нужно, поскольку там много всего, но нужно в ней почистить две папки юзера: Desktop (тобишь рабочий стол) и Мои документы (там где картинки и все прочее.). Так вот вопрос: "это можно как-то дописать к исключению или нужно просто добавить еще одну функцию ниже Sub ClearDir и в ней указать просто эти две папки"? Вот есть код, для размещения ярлыка на рабочем столе, т.е. можно также считать путь к рабочему и удалить там (и по аналогии сделать для папки "Мои Документы")? |
Отправлено: 15:27, 17-05-2010 | #8 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Francyz:
Цитата Francyz:
cInclFiles = Array( _ "\\~\$[^\\]+$", _ "\.(TMP|BAK|TEMP)$") cExclFolders = Array( _ "^.:\\Documents and Settings$", _ "^.:\\Program Files$", _ "^.:\\System Volume Information$", _ "^.:\\WINDOWS$" ) Set oFSO = CreateObject("Scripting.FileSystemObject") For Each oDrive In oFSO.Drives If oDrive.DriveType=2 And oDrive.IsReady Then ClearDir oDrive.DriveLetter &":\", cInclFiles, cExclFolders End If Next ClearDir WScript.CreateObject("WScript.Shell").SpecialFolders("Desktop"), _ cInclFiles, Array("^$") Sub ClearDir(sFldr, cInclFiles, cExclFolders) On Error Resume Next Dim oD, cF, cD, oI, iR If Not IsObject(cInclFiles(0)) Then RegExpComp cInclFiles If Not IsObject(cExclFolders(0)) Then RegExpComp cExclFolders For iR=0 To UBound(cExclFolders) If cExclFolders(iR).Test(sFldr) Then Exit Sub Next Set oD = oFSO.GetFolder(sFldr) Set cF = oD.Files Set cD = oD.SubFolders For Each oI In cF For iR=0 To UBound(cInclFiles) If cInclFiles(iR).Test(oI.Path) Then WScript.Echo "File : " & oI.Path oI.Attributes = 0 oI.Delete Exit For End If Next Next For Each oI In cD ClearDir oI.Path, cInclFiles, cExclFolders Next If oD.Size >0 Then Exit Sub WScript.Echo "Folder: " & oD.Path oD.Attributes = 0 oD.Delete End Sub Sub RegExpComp(ByRef aReg) Dim iReg, sReg For iReg=0 To UBound(aReg) sReg = aReg(iReg) Set aReg(iReg) = CreateObject("VBScript.RegExp") aReg(iReg).Pattern = sReg aReg(iReg).IgnoreCase = True Next End Sub |
||
Последний раз редактировалось amel27, 18-05-2010 в 14:34. Причина: ошибка в скрипте Отправлено: 17:17, 17-05-2010 | #9 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Спасибо за пояснение.
|
Последний раз редактировалось Francyz, 18-05-2010 в 12:32. Причина: вопрос отпал ) Отправлено: 10:41, 18-05-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - [решено] Скрипт для удаления старых файлов и папок из определенной папки | avfiga | Скриптовые языки администрирования Windows | 71 | 07-01-2023 18:50 | |
Любой язык - нужен скрипт для удаления всех файлов кроме нужных для запуска Windows XP | Dark Ange1 | Скриптовые языки администрирования Windows | 11 | 07-03-2010 13:34 | |
[решено] Скрипт для удаления нужных слов в ini файле | Pozia | AutoIt | 23 | 27-10-2009 18:42 | |
MSFT SQL Server - [решено] Преобразование скрипта для Oracle в скрипт для SQL | EvgeniyQQQ | Программирование и базы данных | 3 | 25-03-2009 01:26 | |
Скрипт для удаления директорий | dallas | Программирование и базы данных | 5 | 15-01-2003 19:28 |
|