【问题标题】:"Do" not recognised at start of loop in VBScriptVBScript 循环开始时无法识别“Do”
【发布时间】:2020-06-13 01:06:53
【问题描述】:

所以,我正在做这个手表程序。我有一个循环,用于不断更新时间。但由于某种原因,系统在循环开始时无法识别Do。它在一个while循环中,如果这改变了任何东西。我还输入了On Error Resume Next,但仍然收到错误消息。这有联系吗?帮助将不胜感激。这是源代码:

On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"

While ie.ReadyState <> 4 : WScript.Sleep 100 : Wend

    ie.ToolBar   = False
    ie.StatusBar = False
    ie.Width     = 200
    ie.Height    = 250

    ie.document.body.innerHTML = "<p id='msg'>0</p>"

    Set style = ie.document.CreateStyleSheet
    style.AddRule "p", "text-align: center;"

    ie.Visible = True

    Do
        Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")

        If objItem.DayOfWeek = 1 Then
            day_name = "Monday"
        Else If objItem.DayOfWeek = 2 Then
            day_name = "Tuesday"
        Else If objItem.DayOfWeek = 3 Then
            day_name = "Wednesday"
        Else If objItem.DayOfWeek = 4 Then
            day_name = "Thursday"
        Else If objItem.DayOfWeek = 5 Then
            day_name = "Friday"
        Else If objItem.DayOfWeek = 6 Then
            day_name = "Saturday"
        Else
            day_name = "Sunday"
        End If

        For Each objItem In colItems
            ie.document.getElementById("msg").innerText = "Date:" & vbCrLf & day_name & vbCrLf & objItem.Day & "/" & objItem.Month & "/" & objItem.Year & vbCrLf & vbCrLf & "Time:" & vbCrLf & objItem.Hour & " : " & objItem.Minute & " : " & objItem.Second
        Next
    Loop

While End

【问题讨论】:

  • While End 最后似乎很可疑。您的缩进表明您认为您已经在第一个 While 语句处开始了一个循环,但事实并非如此。整个循环写在一行中。

标签: loops vbscript nested-loops


【解决方案1】:

注意:这里有一些语法错误: 你应该写ElseIf而不是Else If

最后一行 While EndWend

在您的问题中您希望不断更新时间;所以你可以用Do ..Loop 语句来做到这一点,其中Wscript.sleep 1000 内部有1 秒的超时时间

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"

While IE.ReadyState <> 4 : WScript.Sleep 100 : Wend
On Error Resume Next
    IE.ToolBar   = False
    IE.StatusBar = False
    IE.Resizable = False
    IE.Width     = 200
    IE.Height    = 165
    REM Here You can add a title to your window if you like
    IE.Document.title = "My Title goes here"
    IE.document.body.innerHTML = "<p id='msg'></p>"
    Set style = IE.document.CreateStyleSheet
    style.AddRule "p", "text-align: center;"
    REM --------------------------------------------------------------
    REM Just for testing i added those two lines
    style.AddRule "p", "font-family:times new roman;font-weight:bold;"
    style.AddRule "p", "background-color:lightblue;"
    REM --------------------------------------------------------------
    IE.Visible = True
Do
    Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")
    For Each objItem In colItems
        If objItem.DayOfWeek = 1 Then
        day_name = "Monday"
        ElseIf objItem.DayOfWeek = 2 Then
        day_name = "Tuesday"
        ElseIf objItem.DayOfWeek = 3 Then
        day_name = "Wednesday"
        ElseIf objItem.DayOfWeek = 4 Then
        day_name = "Thursday"
        ElseIf objItem.DayOfWeek = 5 Then
        day_name = "Friday"
        ElseIf objItem.DayOfWeek = 6 Then
        day_name = "Saturday"
        Else
        day_name = "Sunday"
        End If
        IE.document.getElementById("msg").innerText = "Date:" & vbCrLf &_
        day_name & vbCrLf &_
        LPad(objItem.Day,2,"0") & "/" & LPad(objItem.Month,2,"0") & "/" & objItem.Year & vbCrLf & vbCrLf &_
        "Time:" & vbCrLf &_
        LPad(objItem.Hour,2,"0") & " : " & LPad(objItem.Minute,2,"0") & " : " & LPad(objItem.Second,2,"0")
    Next
    Wscript.sleep 1000
    If Err Then 'user clicked red X (or alt-F4) to close IE window
        IE.Quit
        Set IE = Nothing
        wscript.quit
    End if
Loop
'---------------------------------------------------------------------------------------
REM This function will left-pad an input value to the given number of characters
REM using the given padding character without truncating the input value:
REM Source : https://stackoverflow.com/questions/18151811/lpad-with-zeros-in-vbscript
REM Written by Ansgar Wiechers
Function LPad(s, l, c)
  Dim n : n = 0
  If l > Len(s) Then n = l - Len(s)
  LPad = String(n, c) & s
End Function
'---------------------------------------------------------------------------------------

【讨论】:

    【解决方案2】:

    问题是你的外部While statement 上有一个额外的Wend,所以While End 需要Do While End 在 VBScript 中不是有效的语法)。 p>

    从此行中删除Wend

    While ie.ReadyState <> 4 : WScript.Sleep 100
    

    并将While End 更改为Wend

    一旦该问题得到解决,您将遇到另一个问题,因为您的内部 Do statement 循环无法退出并将无限继续,除非您通过指定 WhileUntil 提供允许其退出的条件或使用Exit Do

    总结

    这可能不是您想要的,但它会阻止该特定错误。问题是在不猜测您的意图的情况下很难在不改变您的意图的情况下重构代码(但它看起来像@Hackoo has done it。建议您查看提供给 VBScript documentation 的链接,其中详细说明了如何使用 WhileDo 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2017-09-03
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多