2013-08-13 3 views
7

Я новичок VBScript, написав скрипт, который будет синтаксический анализ больших входных файлов и, вероятно, займет несколько минут, чтобы завершить обработку. Мне нужен способ предупредить пользователей о том, что скрипт работает без ошибок в течение этого длительного времени обработки. Моя первая мысль заключалась в том, чтобы представить msgbox для каждой обрабатываемой 1000-й записи (например, «скрипт успешно обработал 1000 записей».) Не совсем взломал надлежащий способ кодирования инкремента, который условно отключил бы msgbox каждую N-ю запись (или определяется, есть ли лучший способ достичь моей конечной цели). Есть идеи?Уведомление о ходе выполнения сценария VBScript

ответ

2

В таких случаях я хотел бы использовать метод WshShell.Popup для предоставления информации о текущем ходе.

Вот пример:

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

Не используйте всплывающие сообщения для этого, если вы не хотите, чтобы раздражать черт из ваших пользователей. Оберните ваш код в HTA, который отображает индикатор прогресса, как в this page, например:

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

Если вы хотите, чтобы обеспечить некоторую более динамическую информацию, можно, например, добавить пункт, как это тело:

</div> 
<p id="sline" style="visibility:hidden;">Processed 
<span id="rcount"></span>&nbsp;Records.</p> 
</body> 
</html> 

и обновлять его каждые 1000 записей:

... 
If numRows Mod 1000 = 0 Then 
    If sline.style.visibility = "hidden" Then sline.style.visibility = "visible" 
    rcount.innerText = numRows 
End If 
... 
5

Если вы используете скрипт в окне консоли (через cscript.exe) то вы можете отобразить лже индикатор непосредственно в окне/вывода, как это:

console window progress bar

Сначала объявить следующие функции в файле 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 

Тогда в верхней части вашего сценария используйте следующий пример:

ForceConsole() 

For i = 1 To 100 
    progress(i, 100) 
Next 
Смежные вопросы