【发布时间】: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>
有问题的两个变量是strProcName 和strProcID,它们在第 28 行定义。
NagWindow 过程在第 69 行被调用。目前,间隔设置为 3 秒,但当我正确设置后将更改为 1 小时。
现在为了解决问题,我正在创建一个文件来输出变量值。它从第 35-43 行的 For...Next 循环开始,该循环创建文本文件并输出变量 strProcName 和 strProcID 以及当前时间。这个位有效,就像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