1 (изменено: Arlekin_s, 2009-03-13 11:17:32)

Тема: VBS: Удаление файлов с завершением процессов.

Добрый день уважаемые скриптописцы )) На работе понадобилась вот такая задачка. Убивать все процессы 1С и удалять все *.cdx.

конечно я сначала воспользовался поиском нашел скрипт по удалению процессов. Скрипт по рекурсивному перебору у меня был. Вы мне уже один раз помогли за что вам еще раз ОРГОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!. но есть одно НО скрипт их перемещает.. Я заменил процедуру MoveFile на DeleteFile убрал лишнее (ну я так думаю что это было лишнее ) вроде бы ничего сложного.. но он почему то ругается на 40-ую строку 1 символ.   Подскажите мне пожалуйста, где я мрачно затупил ?


Dim objFSO
Dim objFolder

Dim strFileName
Dim strPath
Dim lngSize

Dim WshShell, WshFldrs, s

Dim strPath2ArcMail
Dim lngFileSize
'====================================================================
On Error Resume Next

'**********************************__Убиваем процессы_notepad.exe__*************************************
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
    objProc.Terminate
Next
'****************************************************************************************************

MoveExpansionFales = "*.txt"                                ' Файлы которые будут удаляться

set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("MyDocuments") 

Set WshShell = CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

InitialFolder = "D:\111111"                                    ' Каталог, откуда удаляем 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
                                                            ' процедура рекурсивно перебирает файлы в каталоге
Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DeleteFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                DeleteFile objFolderItem.Path
            End If
        End If
    Next
End Sub

                                                            ' процедура удаляет файл
Sub DeleteFile(FilePath)
    On Error Resume Next
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
                                                            ' если у файла назначения есть атрибут ReadOnly, снимаем его
    If objFSO.FileExists(TargetPath) Then
        Set objFile = objFSO.GetFile(TargetPath)
        If objFile.Attributes And 1 Then
            objFile.Attributes = objFile.Attributes - 1
        End If
    End If
    
       ExpansionFile = LCase(Right(FilePath, 4))                'Определяем разширение файла

    If  InStr(MoveExpansionFales , ExpansionFile) Then
    objFSO.MoveFile FilePath, TargetPath 
        If Err.Number <> 0 Then
            LogStream.WriteLine 
            LogStream.WriteLine FilePath
            LogStream.WriteLine Err.Description
            LogStream.WriteLine
            Err.Clear
        Else
            LogStream.WriteLine TargetPath
        End If
    End If
End Sub

2

Re: VBS: Удаление файлов с завершением процессов.

Подскажите мне пожалуйста, где я мрачно затупил ?

Со знаками препинания — точно.

Ошибка не в 40-й строке, а гораздо раньше:

For Each objProc In objService.ExecQuery( …

Называется For без Next.

И для чего у Вас предназначен:

Set WshFldrs = WshShell.SpecialFolders

?

3 (изменено: Arlekin_s, 2009-03-13 11:25:33)

Re: VBS: Удаление файлов с завершением процессов.

Ок.  Я исправил ошибки.. но теперь он ошибки не выдает но останавливается перед этими строками

Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
     ...

он процессы убивает но файлы почему то не удаляет.

4

Re: VBS: Удаление файлов с завершением процессов.

Давайте так, после того, как:

Я исправил ошибки..

Вы будете выкладывать получившийся код. А то мы можем долго и неправильно гадать…

5

Re: VBS: Удаление файлов с завершением процессов.

Arlekin_s,

If objFile.DateCreated < ControlDate Then
  DeleteFile objFolderItem.Path
End If

ControlDate - где определяется?

6

Re: VBS: Удаление файлов с завершением процессов.

я обновлял первый код ))) ..

вот выкладываю с исправлениями

Dim objFSO
Dim objFolder

Dim strFileName
Dim strPath
Dim lngSize

Dim WshShell, WshFldrs, s

Dim strPath2ArcMail
Dim lngFileSize
'====================================================================
On Error Resume Next

'**********************************__Убиваем процессы_notepad.exe__*************************************
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
    objProc.Terminate
Next
'****************************************************************************************************
ControlDate = CDate("01.08.2009")                            ' Контрольная дата (удаляем файлы с датой создания раньше этой)
MoveExpansionFales = "*.txt"                                ' Файлы которые будут удаляться

set WshShell = WScript.CreateObject("WScript.Shell")

Set WshShell = CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

InitialFolder = "D:\111111"                                    ' Каталог, откуда удаляем 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
                                                            ' процедура рекурсивно перебирает файлы в каталоге
Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DeleteFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                DeleteFile objFolderItem.Path
            End If
        End If
    Next
End Sub

                                                            ' процедура перемещает файл
Sub DeleteFile(FilePath)
    On Error Resume Next
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
                                                            ' если у файла назначения есть атрибут ReadOnly, снимаем его
    If objFSO.FileExists(TargetPath) Then
        Set objFile = objFSO.GetFile(TargetPath)
        If objFile.Attributes And 1 Then
            objFile.Attributes = objFile.Attributes - 1
        End If
    End If
End sub

7

Re: VBS: Удаление файлов с завершением процессов.

Arlekin_s пишет:

я обновлял первый код ))) ..

FAQ, § 7.4.

§ 7.4. Исправлять свои посты на форуме не очень хорошо тем, что этих исправлений может никто никогда не заметить - тема при этом не поднимается, и никак не отмечается. Чаще всего лучше добавлять новый пост, а к исправлениям прибегать только в случае мелких грамматических ошибок или подобного.

Т.е., если Вы что-то исправляете в предыдущих постах и хотите, чтобы об этом узнали — укажите на это отдельно.

Arlekin_s пишет:

Я исправил ошибки.. но теперь он ошибки не выдает но останавливается перед этими строками

Sub DeleteFiles(FolderPath)

Всё правильно, так и должно быть, поскольку «Sub …» — это процедура, и для того, чтобы она могла исполняться — она должна быть откуда-то из скрипта быть вызвана. Сама по себе, по ходу движения, она исполняться не начнёт.

8 (изменено: Arlekin_s, 2009-03-13 16:15:16)

Re: VBS: Удаление файлов с завершением процессов.

а подсказать вы можете как это сделать .. Или какую нибуть ссылочку дать

9

Re: VBS: Удаление файлов с завершением процессов.

Пожалуйста. Делать можно так:

' any code…
AnyProc ' or Call AnyProc
' any code…

Sub AnyProc()
    ' any code…
End Sub

10

Re: VBS: Удаление файлов с завершением процессов.

а как тогда работает вот этот скрипт если (насколько я мог определить) в нем нет определения или вызова процедуры

Dim objFSO
Dim objFolder

Dim strFileName
Dim strPath
Dim lngSize

Dim WshShell, WshFldrs, s

Dim strPath2ArcMail
Dim lngFileSize

'====================================================================
On Error Resume Next

VipUsers = "Vipiska2, Drink2, Tabak4"                        ' Пользователи у которых VIP привилегии
MoveExpansionFales = "*.mp3, jpeg, *.jpg, *.bmp"            ' Файлы которые будут перемещаться

set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("MyDocuments") 
strPath = strDesktop 
lngSize = CLng(120*2^20)                                    ' Устанавливаем предельный размер папки Мои документы равный 120 Мб
lngSizeAhtung = CLng(100*2^20)                                ' Устанавливаем порог вывода предупреждения равный 100 Мб    

Set WshShell = CreateObject("WScript.Shell")
Set WshFldrs = WshShell.SpecialFolders
login = WshShell.ExpandEnvironmentStrings("%USERNAME%")

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

    If Not objFSO.FolderExists("D:\pioner\" & login) Then
        objFSO.CreateFolder "D:\pioner\" & login            ' Создаем папку с именем пользоателя если ее нет
    End if
 
InitialFolder = strDesktop                                    ' Каталог, откуда копируем
TargetFolder = "D:\pioner\" &login &"\"                        ' Каталог, куда копируем
ControlDate = CDate("01.08.2009")                            ' Контрольная дата (копируем файлы с датой создания раньше этой)

lngFileSize = objFSO.GetFolder(strPath).Size

If InStr(VipUsers, login) Then
    WScript.Quit 0                                            ' Если VIP пользователь найден тогда выход
    'lngSize = CLng(2^30)                                    ' В идеале можно им увеличить допустимый размер и потом перемещать то,
    'lngSizeAhtung = CLng(900*2^20)                            ' что больше этого размера
End If


If lngFileSize >= lngSizeAhtung Then
    WScript.Echo "ПРЕДУПРЕЖДЕНИЕ, " &login&"!!! Размер папки Мои Документы равен " & FormatNumber(lngFileSize / 2 ^ 20, 3, -2, -2) & "Mb. При достижении размера в" & FormatNumber(lngSize / 2 ^ 20, 3, -2, -2) & "Mb.  файлы с разширением *.avi, *.mp3, *.jpeg будут удалены. Приятной работы." 
WScript.Quit 0
Else
    WScript.Quit 0    
End If


If lngFileSize >= lngSize Then
    WScript.Echo "ПРЕДУПРЕЖДЕНИЕ, " &login&"!!! Размер папки Мои Документы " & strPath & " равен " & FormatNumber(lngFileSize / 2 ^ 20, 3, -2, -2) & "Mb. Он превышет допустимый размер " & FormatNumber(lngSize / 2 ^ 20, 3, -2, -2) & "Mb. Во избежании перебоев в работе сервера файлы с разширением *.avi, *.mp3, *.jpeg были удалены. Приятной работы." 
Else
    WScript.Quit 0    
End If





Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
LogPath = "C:\Script"
Set LogStream = objFSO.OpenTextFile(LogPath & "\"& login &"_MoveLog.log", 8, True)

LogStream.WriteLine "Начало перемещения: ********************** Пользователь "& login &" **********************" & Now()
MoveFiles InitialFolder
LogStream.WriteLine "Конец перемещения: ********************** Пользователь "& login &" **********************" & Now()
LogStream.WriteLin
LogStream.Close

                                                            ' процедура рекурсивно перебирает файлы в каталоге
Sub MoveFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            MoveFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                MoveFile objFolderItem.Path
            End If
        End If
    Next
End Sub

                                                            ' процедура перемещает файл
Sub MoveFile(FilePath)
    On Error Resume Next
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
                                                            ' если у файла назначения есть атрибут ReadOnly, снимаем его
    If objFSO.FileExists(TargetPath) Then
        Set objFile = objFSO.GetFile(TargetPath)
        If objFile.Attributes And 1 Then
            objFile.Attributes = objFile.Attributes - 1
        End If
    End If
    
    ExpansionFile = LCase(Right(FilePath, 4))                'Определяем разширение файла

    If  InStr(MoveExpansionFales , ExpansionFile) Then
    objFSO.MoveFile FilePath, TargetPath 
        If Err.Number <> 0 Then
            LogStream.WriteLine 
            LogStream.WriteLine FilePath
            LogStream.WriteLine Err.Description
            LogStream.WriteLine
            Err.Clear
        Else
            LogStream.WriteLine TargetPath
        End If
    End If
End Sub

                                                            ' процедура создаёт каталог
Sub CreateFolder (FolderPath)
    On Error Resume Next
    ParentFolder = objFSO.GetParentFolderName(FolderPath)
    If Not objFSO.FolderExists(ParentFolder) Then
        CreateFolder ParentFolder
    End If
    objFSO.CreateFolder FolderPath
End Sub

11 (изменено: dmitry_a, 2009-03-13 18:48:33)

Re: VBS: Удаление файлов с завершением процессов.

А это что, если не вызов процедуры ?

MoveFiles InitialFolder
Sub MoveFiles(FilePath)
...
...
End Sub

12

Re: VBS: Удаление файлов с завершением процессов.

ок.. вписал я объявление этой процедуры

Dim objFSO
Dim objFolder

Dim strFileName
Dim strPath
Dim lngSize

Dim WshShell, WshFldrs, s

Dim strPath2ArcMail
Dim lngFileSize
'====================================================================
'On Error Resume Next

'**********************************__Убиваем процессы_notepad.exe__*************************************
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
    objProc.Terminate
Next
'****************************************************************************************************
ControlDate = CDate("01.08.2009")                            ' Контрольная дата (удаляем файлы с датой создания раньше этой)
MoveExpansionFales = "*.txt"                                ' Файлы которые будут удаляться

set WshShell = WScript.CreateObject("WScript.Shell")

Set WshShell = CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

InitialFolder = "D:\111111"                                    ' Каталог, откуда удаляем 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
                                                            ' процедура рекурсивно перебирает файлы в каталоге
DeleteFiles InitialFolder

Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DeleteFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                DeleteFile objFolderItem.Path
            End If
        End If
    Next
End Sub

                                                                                ' процедура перемещает файл
Sub DeleteFile(FilePath)
    On Error Resume Next
    SubPath = Mid(FilePath, Len(InitialFolder) + 1)
    TargetPath = TargetFolder & SubPath
    FolderPath = objFSO.GetParentFolderName(TargetPath)
    If Not objFSO.FolderExists(FolderPath) Then
        CreateFolder FolderPath
    End If
                                                            ' если у файла назначения есть атрибут ReadOnly, снимаем его
    If objFSO.FileExists(TargetPath) Then
        Set objFile = objFSO.GetFile(TargetPath)
        If objFile.Attributes And 1 Then
            objFile.Attributes = objFile.Attributes - 1
        End If
    End If
End sub

он не удаляет (((

13

Re: VBS: Удаление файлов с завершением процессов.

Arlekin_s, используйте следующий код, как образец, для рекурсивного удаления файлов по маске:

Option Explicit


Dim objFSO


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub RecourseDeleteByMask(objFolder, strMask)
    Dim objSubFolder
    Dim strFullFileName
    
    WScript.Echo objFolder.Path                                      ' Выводим путь обрабатываемой папки (для
                                                                     ' отладки; имеет смысл закомментировать).
    
    strFullMask = objFSO.BuildPath(objFolder.Path, strMask)          ' Строим полный путь.
    
    objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    
    On Error Resume Next                                             ' Обрабатываем ошибки, возможные в случае,
                                                                     ' когда нет доступа к содержимому папки
                                                                     ' (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       ' Удалось получить доступ к содержимому папки?
            RecourseDeleteByMask objSubFolder, strMask               ' Вызываем процедуру для каждой из подпапок.
        Else                                                         ' Если не удалось —
            Err.Clear                                                ' сбрасываем состояние ошибки и движемся дальше.
            WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
        End If
    Next
    
    On Error Goto 0                                                  ' Восстанавливаем стандартную обработку ошибок
End Sub
'=============================================================================

Замечание от 18.11.2010: данный код нуждается в доработке, см. ниже посты ##20-23.

14

Re: VBS: Удаление файлов с завершением процессов.

спасибо .. код работает... только в нем пропущено объявление переменной strFullMask.

15

Re: VBS: Удаление файлов с завершением процессов.

Это код для удаления одного файла по маске ?

16

Re: VBS: Удаление файлов с завершением процессов.

Arlekin_s пишет:

спасибо .. код работает... только в нем пропущено объявление переменной strFullMask.

Спасибо. Лишнее нажатие Ctrl-Z . Исправлено:

Option Explicit


Dim objFSO


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub RecourseDeleteByMask(objFolder, strMask)
    Dim objSubFolder
    Dim strFullMask
    
    WScript.Echo objFolder.Path                                      ' Выводим путь обрабатываемой папки (для
                                                                     ' отладки; имеет смысл закомментировать).
    
    strFullMask = objFSO.BuildPath(objFolder.Path, strMask)          ' Строим полный путь.
    
    objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    
    On Error Resume Next                                             ' Обрабатываем ошибки, возможные в случае,
                                                                     ' когда нет доступа к содержимому папки
                                                                     ' (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       ' Удалось получить доступ к содержимому папки?
            RecourseDeleteByMask objSubFolder, strMask               ' Вызываем процедуру для каждой из подпапок.
        Else                                                         ' Если не удалось —
            Err.Clear                                                ' сбрасываем состояние ошибки и движемся дальше.
            WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
        End If
    Next
    
    On Error Goto 0                                                  ' Восстанавливаем стандартную обработку ошибок
End Sub
'=============================================================================

Цитирую:

alexii пишет:

Arlekin_s, используйте следующий код, как образец, для рекурсивного удаления файлов по маске:

В примере производится рекурсивное удаление всех файлов с расширением «*.cdx», начиная с папки «D:\111111»:

…
RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"
…

17

Re: VBS: Удаление файлов с завершением процессов.

ну я имел ввиду что одного типа файлов. т.е. если я пишу

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx, *.dbf"

то он ругается вот на эту строку.

objFSO.DeleteFile strFullMask, True

Не может найти файл.

18

Re: VBS: Удаление файлов с завершением процессов.

Правильно ругается. Пишите так:

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"
RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.dbf"

Или надо менять саму функцию «RecourseDeleteByMask» для поддержки множественных масок.

19

Re: VBS: Удаление файлов с завершением процессов.

о )) спасибо большое )

20

Re: VBS: Удаление файлов с завершением процессов.

Данный скрипт работает при условии, если найден файл в корне, то происходит обработка в подпапках.
Если в корне фалов по маске не найдено, то подпапки скрипт не обрабатывает.

21

Re: VBS: Удаление файлов с завершением процессов.

maxv, какой именно скрипт: укажите пост со скриптом, к которому относится Ваше сообщение.

22 (изменено: maxv, 2010-11-18 20:06:58)

Re: VBS: Удаление файлов с завершением процессов.

#16

Option Explicit

Dim objFSO

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================
Sub RecourseDeleteByMask(objFolder, strMask)
    Dim objSubFolder
    Dim strFullMask
    
    WScript.Echo objFolder.Path                                      ' Выводим путь обрабатываемой папки (для
                                                                     ' отладки; имеет смысл закомментировать).
    
    strFullMask = objFSO.BuildPath(objFolder.Path, strMask)          ' Строим полный путь.
    
    objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    
    On Error Resume Next                                             ' Обрабатываем ошибки, возможные в случае,
                                                                     ' когда нет доступа к содержимому папки
                                                                     ' (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       ' Удалось получить доступ к содержимому папки?
            RecourseDeleteByMask objSubFolder, strMask               ' Вызываем процедуру для каждой из подпапок.
        Else                                                         ' Если не удалось —
            Err.Clear                                                ' сбрасываем состояние ошибки и движемся дальше.
            WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
        End If
    Next
    
    On Error Goto 0                                                  ' Восстанавливаем стандартную обработку ошибок
End Sub

23 (изменено: maxv, 2010-11-18 20:13:46)

Re: VBS: Удаление файлов с завершением процессов.

objFSO.DeleteFile strFullMask, True

после цикла лучше поставить

Option Explicit

Dim objFSO

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

RecourseDeleteByMask objFSO.GetFolder("D:\111111"), "*.cdx"

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================
Sub RecourseDeleteByMask(objFolder, strMask)
    Dim objSubFolder
    Dim strFullMask
    
    WScript.Echo objFolder.Path                                      ' Выводим путь обрабатываемой папки (для
                                                                     ' отладки; имеет смысл закомментировать).
    
    strFullMask = objFSO.BuildPath(objFolder.Path, strMask)          ' Строим полный путь.
    
    On Error Resume Next                                             ' Обрабатываем ошибки, возможные в случае,
                                                                     ' когда нет доступа к содержимому папки
                                                                     ' (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       ' Удалось получить доступ к содержимому папки?
            RecourseDeleteByMask objSubFolder, strMask               ' Вызываем процедуру для каждой из подпапок.
        Else                                                         ' Если не удалось —
            Err.Clear                                                ' сбрасываем состояние ошибки и движемся дальше.
            WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
        End If
    Next

    objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    
    On Error Goto 0                                                  ' Восстанавливаем стандартную обработку ошибок
End Sub

24

Re: VBS: Удаление файлов с завершением процессов.

Спасибо, ясно. Правда, дело обстоит несколько иначе: скрипт не «не обрабатывает», а банально падает с ошибкой из-за:

DeleteFile Method пишет:

Remarks
An error occurs if no matching files are found. …

Тогда, думаю, следует поменять логику таким образом, с:

    objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.

на:

    If objFSO.FileExists(strFullMask) Then
        objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    End If

25

Re: VBS: Удаление файлов с завершением процессов.

maxv пишет:

после цикла лучше поставить smile

Разве от этого скрипт падать перестанет (если убрать On Error Resume Next)? Посему такой вариант мне не нравится.

26

Re: VBS: Удаление файлов с завершением процессов.

с

    If objFSO.FileExists(strFullMask) Then
        objFSO.DeleteFile strFullMask, True                              ' Удаляем файлы по маске.
    End If

не работает вообще

27

Re: VBS: Удаление файлов с завершением процессов.

Угу. Периодически забываю, что не везде поддерживаются маски. File/FolderExists — самое печальное из этого. Приношу свои извинения.

Тогда без вариантов, дабы избежать плясок с бубном — надо перенести команду удаления внутрь «On Error…» и добавить сразу после неё Err.Clear.

28 (изменено: maxv, 2010-11-25 21:07:54)

Re: VBS: Удаление файлов с завершением процессов.

А каким образом в RecourseDeleteByMask можно указать все DriveType=1?
То есть сканирование всех внешних носителей.

29

Re: VBS: Удаление файлов с завершением процессов.

В «RecourseDeleteByMask» — никак. Этот перебор надо делать снаружи, в основном модуле, наподобие этого: VBScript: поиск файла.

30

Re: VBS: Удаление файлов с завершением процессов.

Понятно. А, например, через маску, если указать -

RecourseDeleteByMask shell.GetFolder("C:\"), "*.$$$"
RecourseDeleteByMask shell.GetFolder("D:\"), "*.$$$"
RecourseDeleteByMask shell.GetFolder("E:\"), "*.$$$"

возможно?

31

Re: VBS: Удаление файлов с завершением процессов.

Ну, да. Это ведь, в принципе, то же самое, только «ручками». А в примере по ссылке делается автоматически: в основной части — перебор всех смонтированных дисков, из них отбираются нужные (и доступные), затем вызывается процедура перебора для корневого каталога диска.