vbscript - pendrive - ¿Cómo pausar el script VBS mientras se elimina la carpeta?
window2 vbs (4)
Estoy escribiendo un VBScript para SyncBack (utilidad de copia de seguridad) en el que estoy eliminando versiones anteriores de una copia de seguridad.
'''' # 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
Sin embargo, ocasionalmente la carpeta (que contiene la copia de seguridad anterior) que estoy intentando eliminar tarda más de 2 segundos en eliminar WScript.Sleep 2000 y me preguntaba si había alguna manera de hacer que el script espere hasta que la carpeta haya sido borrado antes de que se imprima "Deleted <foldername> successfully".
Idealmente, me encantaría algo como:
While oFolder.IsDeleting() Then
WScript.Echo "Still deleting..."
WScript.Sleep 2000
Loop
Pero soy consciente de que probablemente ese no sea el caso.
Dormir en bucle con contador, la nota asume que el host de CScript hace que el mensaje "Aún borrar" sea un poco más variable. La demora en el ejemplo es de 30 segundos.
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
Puede mover la eliminación a su propia función y agregar un tiempo de espera. por lo tanto, si la carpeta no se elimina en un período de tiempo razonable, la función regresará sin borrar la carpeta. Algo como esto:
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
Luego llama a la función de esta manera
If DeleteFolder("C:/New Folder", 5) Then
Wscript.Echo "Folder Deleted"
Else
Wscript.Echo "Folder could NOT be deleted"
End If
ADVERTENCIA: no se recomienda el uso de On Resume Resume Next .
Este comando hará que se ignoren todos los errores y solo se debe usar bajo la supervisión de un adulto.
Los efectos secundarios pueden incluir: Errores extraños en otras partes de un guión, acción inesperada del guión, dolor de cabeza, mareos, confusión, enojo o un impulso repentino de maldecir. En casos raros, se sabe que este comando causa sangrado en los ojos y los oídos. El uso de este comando puede provocar pérdida de cabello y trabajo.
While fso.FolderExists(DelFoldername)
WScript.Echo "Still deleting"
WScript.Sleep 1000
Wend
¿Por qué no seguir comprobando si la carpeta aún existe y salir una vez que se ha ido?
''Hacer'' Si la carpeta no existe, salga de Do ''Loop