11

私は VBScript の初心者で、大きな入力ファイルを解析するスクリプトを作成しており、処理を完了するのに数分かかる可能性があります。この長い処理時間の間、スクリプトがエラーなしで実行されていることをユーザーに警告する方法が必要です。私が最初に考えたのは、処理される 1000 番目のレコードごとに msgbox を提示することでした (たとえば、「スクリプトはこれまでに 1000 レコードを正常に処理しました」)。私の最終目標を達成するためのより良い方法があるかどうかを判断します)。何か案は?

4

7 に答える 7

9

コンソール ウィンドウで (cscript.exe を介して) スクリプトを実行している場合は、次のようにウィンドウ/出力に偽の進行状況バーを直接表示できます。

コンソール ウィンドウの進行状況バー

まず、VBS ファイルで次の関数を宣言します。

Function printi(txt)
    WScript.StdOut.Write txt
End Function    

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
于 2015-11-11T13:28:18.237 に答える
4

ユーザーを困らせたい場合を除き、ポップアップ メッセージを使用しないでください。このページのような進行状況インジケーターを表示するHTAでコードをラップします。

<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
...
于 2013-08-13T19:35:28.057 に答える
4

そのような場合、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
于 2013-08-13T18:13:10.133 に答える