在sub中时,VBS不会完成循环,但在不在

时间:2016-04-21 15:21:57

标签: loops for-loop vbscript

长话短说,我有一个VBS脚本,我正在用嵌套的For循环编写。

如果我把代码放在sub中,它就不会完成循环。如果代码在主要代码中,则确实如此。例如:

Do
    For x = 0 to 9
        For y = 0 to 9
            For z = 0 to 9
                want = CStr(x) & "." & CStr(y) & "." & CStr(z)
                If want = "5.1.3"
                    Exit Do
                End If
            Next
        Next
    Next
Loop While 1 = 1

如果这是主要的,它是有效的。但是这个:

NestedLoop()

Sub NestedLoop()
    Do
        For x = 0 to 9
            For y = 0 to 9
                For z = 0 to 9
                    want = CStr(x) & "." & CStr(y) & "." & CStr(z)
                    If want = "5.1.3"
                        Exit Do
                    End If
                Next
            Next
        Next
    Loop While 1 = 1
End Sub

只会循环到2.0.5

以下是每个的完整源代码:

Nested Loop in Main

Nested Loop in Sub

长话短说,它做的是检测操作系统拱(x86或x64),转到VLC的下载索引(https://download.videolan.org/pub/videolan/vlc/last/win64/或/ win32 /)并下载到工作目录,无论什么版本的exe解析为HTTP状态200.这也会在C:\ Temp \ _vlc-installer.txt生成一个日志文件

那为什么它不能用于子?我知道我可以把它放在主要的,但我更喜欢一个子。

FWIW,这是一个“工作面试”项目。我和另一位职位候选人的任务是提出自动部署解决方案。

1 个答案:

答案 0 :(得分:1)

您的两个脚本都有全局On Error Resume Next语句,因此我认为您需要了解更多有关其工作方式的信息。
请注意大胆的句子。

来自On Error Statement

  

[...]

     

在任何特定程序中,错误不一定是致命的   只要在调用堆栈的某处启用了错误处理。 如果   过程和错误中未启用本地错误处理   发生时,控制权通过调用堆栈传回,直到a   找到启用了错误处理的过程,错误是   此时处理。如果找不到调用堆栈中的过程   启用错误处理后,会显示错误消息   点和执行停止或主机处理错误   合适的。

     

On Error Resume Next 会导致执行继续执行该语句   紧跟在导致运行时错误的语句之后,或者   在最近一次电话会议之后立即发表声明   包含On Error Resume Next语句的过程。这个   尽管存在运行时错误,但允许继续执行。那你可以   在程序中内联构建错误处理例程。

     

On On Error Resume Next语句在另一个语句时变为非活动状态   调用过程,因此您应该执行On Error Resume Next   如果要进行内联错误处理,请在每个被调用的例程中声明   在该例程中。当退出过程时,错误处理   功能恢复到之前的错误处理   进入退出的程序。

     

[...]

在您的情况下,当您的子过程名为FindVLC时发生错误时,它会立即退出(跳转到End Sub),然后通过忽略错误继续处理全局范围。

因此,如果您想忽略(或处理)文档中的错误,您应该在子例程中执行On Error Resume Next语句。

Sub FindVLC()
    On Error Resume Next
    'for loops etc.
End Sub