2013-08-13 18 views
7

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

2

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 
4

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>&nbsp;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 
... 
5

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:

console window progress bar

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