【问题标题】:Having issue with variable inside HTA subHTA sub 中的变量有问题
【发布时间】:2018-07-17 06:50:32
【问题描述】:

我有一个 HTA,我想运行四个小时,然后每小时聚焦一次以作为提醒。我遇到的问题是有一个 Sub 不能多次识别变量。我先贴出代码再解释一下:

<HTML>

<HEAD>

<style type="text/css">
    p {font-family: 'Segoe UI Light'; font-size: 12pt}
    td {font-family: 'Segoe UI Light'; font-size: 12pt}
    input {font-family: 'Segoe UI Light'; font-size: 12pt}
    body {font-family: 'Segoe UI Light'; font-size: 12pt; color: #4D4C5C; background-color: white; background-image: url("MOEUpgrade.png")}
</style>

<TITLE>QT MOE Upgrade</TITLE>

<HTA:APPLICATION ID="MOEUpgrade"
    APPLICATIONNAME="MOE Upgrade"
    BORDER="dialog"
    SCROLL="no"
    SHOWINTASKBAR="yes"
    SINGLEINSTANCE="yes"
    SYSMENU="no"
    ICON="MOEUpgrade.ico">
</HEAD>

<SCRIPT LANGUAGE="VBScript">

Dim pbTimerID, pbHTML, pbWaitTime, pbHeight, pbWidth
Dim pbBorder, pbUnloadedColor, pbLoadedColor, pbStartTime
Dim iTimerID, strProcName, strProcID

Set objShell = CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%MOEUpgrade.hta%'")
Set objFSO = CreateObject("Scripting.FileSystemObject")

For Each objProcess in colProcesses

    Set objFile = objFSO.CreateTextFile("C:\MDT\ProcIDs.txt")
    strProcName = objProcess.Name
    strProcID = objProcess.ProcessID
    objFile.WriteLine Now
    objFile.WriteLine strProcName & " - " & strProcID

Next

Sub Window_OnLoad

    pbWaitTime = 14400
    pbHeight = 35
    pbWidth= 760
    pbUnloadedColor="white"
    pbLoadedColor="#F69220"
    pbBorder="#4D4C5C"
    pbStartTime = Now
    rProgressbar
    pbTimerID = window.setInterval("rProgressbar", 200)

    Set colItems = objWMIService.ExecQuery("Select * From Win32_VideoController WHERE AdapterDACType='Internal'")

    For Each objItem in colItems
        intHorizontal = objItem.CurrentHorizontalResolution
        intVertical = objItem.CurrentVerticalResolution
    Next

    intLeft = (intHorizontal-1024)/2
    intTop = (intVertical-600)/2
    self.resizeto 1024,600
    self.moveTo intLeft,intTop
    self.focus()
    iTimerID = window.setInterval("NagWindow",3000)

End Sub

Sub rProgressbar

    pbHTML = ""
    pbSecsPassed = DateDiff("s",pbStartTime,Now)
    pbSecsToGo = Int(pbWaitTime - pbSecsPassed)
    pbMinsToGo = Int(pbSecsToGo / 60)
    pbHrsToGo = Int(pbMinsToGo / 60)
    pbLoadedWidth = (pbSecsPassed / pbWaittime) * pbWidth
    pbUnloadedWidth = pbWidth - pbLoadedWidth

    pbHTML = pbHTML & "<table border=1 bordercolor=" & pbBorder & " cellpadding=0 cellspacing=0 width=" & pbWidth & "><tr>"
    pbHTML = pbHTML & "<th width=" & pbUnloadedWidth & " height=" & pbHeight & "align=left bgcolor="  & pbLoadedColor & "></th>"
    pbHTML = pbHTML & "<th width=" & pbLoadedWidth & " height=" & pbHeight & "align=left bgcolor="  & pbUnLoadedColor & "></th>"
    pbHTML = pbHTML & "</tr></table>"
    pbHTML = pbHTML & "<table border=0 cellpadding=0 cellspacing=0 width=" & pbWidth & "><tr>"

    Select Case TRUE

        Case pbSecsToGo <= 59
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo > 60 And pbSecsToGo <= 119
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbMinsToGo & " minute, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 120 And pbSecsToGo <= 3599
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbMinsToGo & " minutes, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 3600 And pbSecsToGo <= 3659
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hour, " & pbMinsToGo & " minute, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 3660 And pbSecsToGo <= 7199
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hour, " & pbMinsToGo & " minutes, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 7200 And pbSecsToGo <= 7259
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hours, " & pbMinsToGo & " minute, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 7260 And pbSecsToGo <= 10759
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hours, " & pbMinsToGo & " minutes, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 10800 And pbSecsToGo <= 10859
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hours, " & pbMinsToGo & " minute, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo >= 10900
            pbSecsToGo = pbSecsToGo - (pbMinsToGo * 60)
            pbMinsToGo = pbMinsToGo - (pbHrsToGo * 60)
            pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbHrsToGo & " hours, " & pbMinsToGo & " minutes, " & pbSecsToGo & " seconds remaining</td>"
        Case pbSecsToGo = 14430
            NagWindow
    End Select

    pbHTML = pbHTML & "</tr></table>"
    progressbar.InnerHTML = pbHTML

    If DateDiff("s",pbStartTime,Now) >= pbWaitTime Then
        StopTimer
        StartUpgradeTimeout
    End If

End Sub

Sub NagWindow

    objFile.WriteLine Now
    objFile.WriteLine strProcName & " - " & strProcID
    objFile.Close

End Sub

Sub StopTimer

    window.clearInterval(pbTimerID)

End Sub

Sub StartUpgradeTimeout

    self.close()

End Sub

Sub StartUpgradeNow

    If MsgBox ("Are you sure you want to start the upgrade now?",vbYesNo+vbExclamation,"Confirm Upgrade") = vbYes Then
        self.close()
    End If

End Sub

</SCRIPT>
<BODY>

    <div align="justify">
    <p>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    </p>
    </div>
    <div align="center">
    <span id = "progressbar"></span>
    <br>
    <span class="tooltip" title="Press OK to start the upgrade now"><input type="button" name="OKButton" value="   OK   " onClick="StartUpgradeNow" style="font-family: 'Segoe UI Light'"></span>
     </div>
</BODY>
</HTML>

有问题的两个变量是strProcNamestrProcID,它们在第 28 行定义。

NagWindow 过程在第 69 行被调用。目前,间隔设置为 3 秒,但当我正确设置后将更改为 1 小时。

现在为了解决问题,我正在创建一个文件来输出变量值。它从第 35-43 行的 For...Next 循环开始,该循环创建文本文件并输出变量 strProcNamestrProcID 以及当前时间。这个位有效,就像NagWindow Sub 的第一次迭代一样,我再次将当前时间和变量输出到同一个文件,然后关闭它。

文件内容如下:

2018 年 7 月 2 日下午 2:14:04 mshta.exe - 13916 2018 年 7 月 2 日下午 2:14:07 mshta.exe - 13916

有趣的是,如果我将 objFile.Close 操作从第 141 行移到了 Sub 之外,它只会在失败前循环一次,即它只正确处理第 40 行和第 41 行的第一个 objFile.WriteLine 操作。

最终,我想在NagWindow Sub 中使用以下命令行:

objShell.AppActivate strProcName.strProcID

但那是我发现变量的问题之后。

【问题讨论】:

  • 当已有解决原始问题中描述的问题的答案时,请不要移动目标。如果您有新问题或后续问题:发布新问题。

标签: variables vbscript procedure hta


【解决方案1】:

您在&lt;script&gt; 块的开头(在全局范围内)创建(并打开)文件,但在过程NagWindow 中关闭它,而无需重新打开它。因此,当您第二次调用 NagWindow 时,您会尝试写入已关闭的文件。

在您创建并更改的For Each 循环之后关闭文件

Sub NagWindow

    objFile.WriteLine Now
    objFile.WriteLine strProcName & " - " & strProcID
    objFile.Close

End Sub

进入

Sub NagWindow
    Set objFile = objFSO.OpenTextFile("C:\MDT\ProcIDs.txt", 8)
    objFile.WriteLine Now
    objFile.WriteLine strProcName & " - " & strProcID
    objFile.Close
End Sub

问题就会消失。

【讨论】:

  • 您好,感谢您的回复。我按照你的建议做了,文件现在是空的。我只是将该文件用作故障排除工具,真正的问题是 NagWindow Sub 无法识别 strProcName 和 strProcID 变量。
  • @JAG 我的错。您需要重新打开文件以进行附加。查看更新的答案。
  • 谢谢,你能看看我的“答案”,看看你能不能找出问题所在?
猜你喜欢
  • 2018-07-19
  • 2012-01-06
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2012-01-22
  • 2013-11-30
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多