我有一个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行定义。
在第69行调用NagWindow
过程。此时,间隔设置为3秒,但是当我将其设置为正确时,它将更改为一小时。
现在为了解决问题,我正在创建一个文件来输出变量值。它从第35-43行的For...Next
循环开始,创建文本文件并输出变量strProcName
和strProcID
以及当前时间。这个位有效,就像NagWindow
Sub的第一次迭代一样,我再次将当前时间和变量输出到同一个文件,然后关闭它。
该文件的内容如下:
7/02/2018 2:14:04 PM mshta.exe - 13916 7/02/2018 2:14:07 PM mshta.exe - 13916
有趣的是,如果我从第141行移动objFile.Close
操作,使它现在在Sub之外,它只会在失败之前循环一次,即它只是正确处理第40行和第40行的第一个objFile.WriteLine
操作; 41。
最后,我想在NagWindow
Sub:
objShell.AppActivate strProcName.strProcID
但是,我曾经想过变量的问题。
答案 0 :(得分:1)
您在<script>
块的开头(在全局范围内)创建(并打开)该文件,但在过程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
问题就会消失。