2009-11-20 1 views
3

Я пишу VBScript для SyncBack (утилита резервного копирования), в которой я удаляю старые версии резервной копии.Как приостановить скрипт VBS во время удаления папки?

'' # if current version is greater than the total allowed number of versions, 
    '' # delete the oldest folder 
    If versionNumber > totalVersions Then 
     delDirNum = versionNumber - totalVersions 
     If delDirNum > 0 Then 
      DelFoldername = containerFileOrFolder & "\" & delDirNum & "_" 
       '' " # Ignore this line SO Prettify doesn't do VB very well. 
      If fso.FolderExists(DelFoldername) = True Then 
       WScript.Echo "Deleting: <" & DelFoldername & ">" 
       Set oFolder = objFileSystem.GetFolder(DelFoldername) 
       oFolder.Delete() 
       WScript.Sleep 2000 
       If fso.FolderExists(DelFoldername) = False Then 
        WScript.Echo "Deleted <" & DelFoldername & "> successfully" 
       Else 
        WScript.Echo "Could not delete <" & DelFoldername & ">" 
       End If 
      End If 
     End If 
    End If 

Однако иногда папка (которая содержит старую резервную копию), который я пытаюсь удалить занимает больше времени, что 2 секунды на WScript.Sleep 2000 удалить, и мне было интересно, если есть способ чтобы сценарий подождал, пока папка не будет удалена, прежде чем она выведет «Удалено < имя папки > успешно».

В идеале я хотел бы что-то вроде:

While oFolder.IsDeleting() Then 
    WScript.Echo "Still deleting..." 
    WScript.Sleep 2000 
Loop 

Но я хорошо известно, что это, вероятно, не будет так.

+0

Что тип objFileSystem? –

+0

FileSystemObject: http://msdn.microsoft.com/en-us/library/z9ty6h50(VS.85).aspx –

ответ

1

Loop sleep with counter, note принимает сервер CScript, который делает сообщение «Still Deleting» немного более приятным. Задержка в примере составляет 30 секунд.

Dim loopCount : loopCount = 0 
WScript.StdOut.Write "Deleting ." 
Do While fso.FolderExists(DelFoldername) And loopCount < 30 
    WScript.Sleep 1000 
    WScript.StdOut.Write "." 
    loopCount = loopCount + 1 
Loop 
WScript.StdOut.Write vbCrLf 
If fso.FolderExists(DelFolderName) Then 
    '' # Do stuff due to failure. 
End If 
+0

Нет ли другого способа сделать это, кроме как угадать максимальное время, которое потребуется для удаления папки, и использование этого в качестве предела? – Jon

+2

Вы беспокоились о том, чтобы ждать бесконечно, поэтому должен быть предел. Таким образом, возникает вопрос: «Как определить, какое максимальное количество времени ждать, пока я не буду уверен, что удаление папки определенно не удалось?». Это вопрос, который невозможно ответить, но мы можем использовать здравый смысл и изменить его на «то, что является максимальным __размерным количеством времени ...». Мой совет, используйте 300 секунд, а затем подожди и посмотри, сколько раз это не покрывает, мои деньги идут на Нет. – AnthonyWJones

+0

Моя забота заключалась в том, чтобы ждать неопределенно долго, если папка не может быть удалена. @ Включение Tester101 «On Error ...» полезно, потому что это должно гарантировать, что ожидание не будет бесконечным в случае возникновения ошибки при удалении папки и ее содержимого. Кроме того, мне, вероятно, придется составить предел, как вы уже сказали. – Jon

3
While fso.FolderExists(DelFoldername) 
    WScript.Echo "Still deleting" 
    WScript.Sleep 1000 
Wend 
+0

Это то, что я собирался сделать, но что делать, если скрипт не может удалить папку? Бесконечная петля? – Jon

+0

Если у вас включено «Возобновление ошибок», оно будет, если нет, ошибка будет автоматически отменена. –

2

Вы можете перенести удаление в его собственную функцию и добавить таймаут. поэтому, если папка не удаляется в течение разумного промежутка времени, функция возвращается без удаления папки. Что-то вроде этого:

Function DeleteFolder(Folder, Timeout) 
'Folder is the full file path of the folder 
'Timeout is the amount of time to wait for the folder to be deleted (in seconds). 
    On Error Resume Next 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    If fso.FolderExists(Folder) Then 
     fso.DeleteFolder Folder, True 
     start = Now() 
     do while fso.FolderExists(Folder) AND DateDiff("s",start,Now()) < Timeout 
      wscript.sleep 1000 
     Loop 
    End If 
    If fso.FolderExists(Folder) Then 
     DeleteFolder = False 
    Else 
     DeleteFolder = True 
    End If 
End Function 

Затем вызовите функцию как этот

If DeleteFolder("C:\New Folder", 5) Then 
    Wscript.Echo "Folder Deleted" 
Else 
    Wscript.Echo "Folder could NOT be deleted" 
End If 

ПРЕДУПРЕЖДЕНИЕ: Использование On Error Resume Next это не рекомендуется.
Эта команда приведет к игнорированию всех ошибок и должна использоваться только под наблюдением взрослых.

Побочные эффекты могут включать в себя: Странные ошибки в других частях скрипта, непредвиденное действие сценария, головная боль, головокружение, спутанность сознания, гнев или внезапное желание проклинать. В редких случаях эта команда, как известно, вызывает кровотечение из глаз и ушей. Использование этой команды может привести к потере волос и потере работы.

+1

Зачем вам использовать On Error Resume Next? – AnthonyWJones

+1

Поскольку я не забочусь об ошибках в этой функции, мне все равно, удалена ли папка или нет. Должен ли сценарий прерываться, если он сталкивается с ошибкой? От взгляда на код OP я бы сказал, что они не хотят, чтобы сценарий остановился, они просто хотят знать, была ли папка удалена или нет. – Tester101

+0

Нет ли другого способа сделать это, кроме как угадать максимальное время, которое потребуется, чтобы удалить папку и использовать ее как предел? – Jon

0

Почему бы не просто продолжить проверку, чтобы увидеть, существует ли папка, и выйти, как только она исчезла?

'Do ' Если папка не существует, выход Do 'Loop

Смежные вопросы