在HTA sub

时间:2018-02-07 04:29:51

标签: variables vbscript procedure hta

我有一个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行定义。

在第69行调用NagWindow过程。此时,间隔设置为3秒,但是当我将其设置为正确时,它将更改为一小时。

现在为了解决问题,我正在创建一个文件来输出变量值。它从第35-43行的For...Next循环开始,创建文本文件并输出变量strProcNamestrProcID以及当前时间。这个位有效,就像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

但是,我曾经想过变量的问题。

1 个答案:

答案 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

问题就会消失。