論理制御フローの問題に取り組むときは、ストーリー/説明から始めるのが最善です。
アンインストール プロセスを開始し、それが成功または失敗して終了するのを待ちたい (適切なタイトルのウィンドウを開くことで示される)
条件で True/False に対する比較を使用しないでください。それはエラーが発生しやすい脂肪です。
非ブール値を変換するために VBscript のインテリジェンスに依存しないでください。条件で適切な (サブ) タイプの変数/式を使用します。
VBScript は条件の評価を省略しないことに注意してください。
If This() Or That() Then
This が True を返す場合でも、両方の関数を呼び出します (したがって、句全体が True でなければなりません)。したがって、次のように誘惑されないでください。
... Until (objShell.AppActivate("Uninstall - Success") Or _
objShell.AppActivate("Uninstall - Failure"))
ループを設計するときは、脱退チェックをいつ行うべきかを考えてください。空の可能性のあるファイルから読み取りたい場合は、早めに確認することをお勧めします。
Do Until tsIn.AtEndOfStream
sLine = tsIn.ReadLine()
...
Loop
ただし、ユーザーから有効な入力を取得したい場合は、確認する前に尋ねる必要があります。
Do
sInp = ...
Loop While isBad(sInp)
.AppActivate と .SendKeys はすべてのプログラマーの敵です。制御フローの問題が解決されるまで、それらとの戦いを延期します。
コード内:
' Wait Wait Fail Success
' , Array(False, False, True , True ) _ shouldn't happen, but will terminate too
Dim aHappenings : aHappenings = Array( _
Array(False, False, False, True ) _
, Array(False, False, True , False) _
)
Dim aTest
For Each aTest In aHappenings
WScript.Echo Join(aTest)
Dim bOk : bOk = False
Dim bFail : bFail = False
Dim i : i = 0
Do
bOk = aTest(i + 0)
bFail = aTest(i + 1)
WScript.Echo Join(Array(" ", i, bOk, bFail))
i = i + 2
Loop Until bOk Or bFail
WScript.Echo "Done."
WScript.Echo
Next
出力:
False False False True
0 False False
2 False True
Done
False False True False
0 False False
2 True False
Done.
成功または失敗のいずれか (両方ではない) が発生するという事実を利用できます。
Dim i : i = 0
Dim bDone
Do
bDone = aTest(i + 0)
If Not bDone Then
bDone = aTest(i + 1)
End If
WScript.Echo Join(Array(" ", i, bDone))
i = i + 2
Loop Until bDone