【问题标题】:How do I pause VBS script while folder is deleted?删除文件夹时如何暂停 VBS 脚本?
【发布时间】:2014-07-04 06:23:58
【问题描述】:

我正在为 SyncBack(备份实用程序)编写一个 VBScript,其中我正在删除旧版本的备份。

    '' # 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

但是,有时我试图删除的文件夹(包含旧备份)需要更长的时间才能删除 WScript.Sleep 2000 的 2 秒,我想知道是否有办法让脚本等到文件夹被删除后才打印出“Deleted 成功”。

理想情况下,我会喜欢这样的东西:

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

但我很清楚情况可能并非如此。

【问题讨论】:

标签: vbscript


【解决方案1】:
While fso.FolderExists(DelFoldername)
   WScript.Echo "Still deleting"
   WScript.Sleep 1000
Wend

【讨论】:

  • 这就是我要做的,但是如果脚本无法删除文件夹怎么办?无限循环?
  • 如果你有 On Error Resume ,如果没有,错误会自动中止。
【解决方案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
此命令将导致忽略所有错误,并且只能在成人监督下使用。

副作用可能包括: 脚本其他部分的奇怪错误、意外的脚本操作、头痛、头晕、困惑、愤怒或突然想要诅咒的冲动。在极少数情况下,已知此命令会导致眼睛和耳朵出血。使用此命令可能会导致脱发和失业。

【讨论】:

  • 你为什么要使用 On Error Resume Next ?
  • 因为我不关心这个函数的错误,我只关心文件夹是否被删除。如果遇到错误,脚本是否应该中止?通过查看 OP 的代码,我会说他们不希望脚本停止,他们只想知道文件夹是否被删除。
  • 除了猜测删除文件夹所需的最长时间并将其用作限制之外,真的没有其他方法吗?
  • @Tester101:您确定当发生任何可能的错误时,该函数在所有情况下都会返回适当的 True 或 False 值?
  • @Jon:我想不出任何方法可以知道删除一个文件夹需要多长时间,除了删除一堆包含相同大小的相同文件类型的相同大小的文件夹并计时。然后你可以取一个平均值并将其用作超时,否则我想不出一种方法来知道操作应该花费多长时间。
【解决方案3】:

带计数器的循环睡眠,注意假定 CScript 主机,这使得“仍在删除”消息更易于处理。示例中的延迟为 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

【讨论】:

  • 除了猜测删除文件夹所需的最长时间并将其用作限制之外,真的没有其他方法吗?
  • 您担心无限期等待,因此必须有一个限制。所以问题变成了“我如何确定等待文件夹删除肯定失败的最长时间?”。这是一个不可能回答的问题,但我们可以使用一些常识并将其修改为“最大 合理 时间量是多少......”。我的建议是,使用 300 秒,然后等待,看看有多少次没有覆盖它,我的钱是没有的。
  • 我担心的是在文件夹无法删除的情况下无限期等待。 @Tester101 包含“错误时...”很有用,因为这应该确保在删除文件夹及其内容时发生错误的情况下等待不是无限的。除此之外,我可能必须按照您的建议进行限制。
  • 我想管理脚本的方法与典型的开发人员实践有所不同。我会避免 On Error Resume Next 就像瘟疫把它藏起来一样,在一个小函数中受它保护的代码行,当然不会让任何杂乱的代码占上风。在这种情况下,不必担心错误会导致无限循环,因为错误会按照预期进行。
  • 我在帖子中添加了警告。希望它能让您对我使用 On Error Resume Next 感到更放心。
【解决方案4】:

为什么不继续检查文件夹是否仍然存在,一旦消失就退出?

' 做 ' 如果文件夹不存在,退出 Do '循环

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2020-01-11
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多