Sono un debuttante di VBScript, sto scrivendo uno script che analizzerà file di input di grandi dimensioni e richiederà probabilmente diversi minuti di esecuzione per completare l'elaborazione. Ho bisogno di un modo per avvisare gli utenti che lo script è in esecuzione senza errori durante questo lungo tempo di elaborazione. Il mio primo pensiero è stato quello di presentare un msgbox per ogni 1000 record elaborato (ad esempio "lo script ha elaborato con successo fino a 1000 record.") Non ho ancora decifrato il modo corretto di codificare un incrementatore che condizionerà un msgbox ogni N ° record (o determinato se c'è un modo migliore per raggiungere il mio obiettivo finale). Qualche idea?Notifica avanzamento script VBScript
risposta
In questi casi, mi piacerebbe utilizzare il metodo WshShell.Popup per fornire informazioni sullo stato attuale.
Ecco un esempio:
Dim WshShell, i
Set WshShell = CreateObject("WScript.Shell")
For i = 1 To 500
'Do Something
If i Mod 100 = 0 Then 'inform for every 100 process
WshShell.Popup i & " items processed", 1, "Progress" ' show message box for a second and close
End If
Next
Non utilizzare messaggi pop-up per questo a meno che non si vuole infastidire il heck fuori dei vostri utenti. Avvolgere il codice in un HTA che consente di visualizzare un indicatore di avanzamento come quello di this page, ad esempio:
<html>
<head>
<title>Sample</title>
<hta:application
applicationname="Sample"
scroll="no"
singleinstance="yes"
windowstate="normal"
>
<script language="vbscript">
Sub Window_onLoad
'your code here
End Sub
</script>
<style type="text/css">
* {
font-size: 1px;
margin: 1px;
}
div {
position: absolute;
left: 40%;
top: 50%;
}
marquee {
border: 1px solid;
height: 15px;
width: 200px;
}
marquee span {
height: 11px;
width: 8px;
background: Highlight;
float: left;
}
.handle-0 { filter: alpha(opacity=20); -moz-opacity: 0.20; }
.handle-1 { filter: alpha(opacity=40); -moz-opacity: 0.40; }
.handle-2 { filter: alpha(opacity=60); -moz-opacity: 0.6; }
.handle-3 { filter: alpha(opacity=80); -moz-opacity: 0.8; }
.handle-4 { filter: alpha(opacity=100); -moz-opacity: 1; }
</style>
</head>
<body>
<div>
<marquee direction="right" scrollamount="8" scrolldelay="100">
<span class="handle-0"></span>
<span class="handle-1"></span>
<span class="handle-2"></span>
<span class="handle-3"></span>
<span class="handle-4"></span>
</marquee>
</div>
</body>
</html>
Se si desidera fornire alcune informazioni più dinamico, si potrebbe per esempio aggiungere un paragrafo come questo per il corpo:
</div>
<p id="sline" style="visibility:hidden;">Processed
<span id="rcount"></span> Records.</p>
</body>
</html>
e aggiornarlo ogni 1000 record:
...
If numRows Mod 1000 = 0 Then
If sline.style.visibility = "hidden" Then sline.style.visibility = "visible"
rcount.innerText = numRows
End If
...
Se si esegue lo script in una finestra di console (tramite cscript.exe) allora si può visualizzare una barra di avanzamento finto direttamente nella finestra/output come questo:
prima dichiarare le seguenti funzioni nel file VBS:
Function printr(txt)
back(Len(txt))
printi txt
End Function
Function back(n)
Dim i
For i = 1 To n
printi chr(08)
Next
End Function
Function percent(x, y, d)
percent = FormatNumber((x/y) * 100, d) & "%"
End Function
Function progress(x, y)
Dim intLen, strPer, intPer, intProg, intCont
intLen = 22
strPer = percent(x, y, 1)
intPer = FormatNumber(Replace(strPer, "%", ""), 0)
intProg = intLen * (intPer/100)
intCont = intLen - intProg
printr String(intProg, ChrW(9608)) & String(intCont, ChrW(9618)) & " " & strPer
End Function
Function ForceConsole()
Set oWSH = CreateObject("WScript.Shell")
vbsInterpreter = "cscript.exe"
If InStr(LCase(WScript.FullName), vbsInterpreter) = 0 Then
oWSH.Run vbsInterpreter & " //NoLogo " & Chr(34) & WScript.ScriptFullName & Chr(34)
WScript.Quit
End If
End Function
Poi nella parte superiore dello script utilizzare il seguente esempio:
ForceConsole()
For i = 1 To 100
progress(i, 100)
Next