0

VBS スクリプトを使用してプログラムで ClickOnce アプリケーションをアンインストールしようとしています。それはかなりうまくいきます。しかし、アンインストールが失敗した場合は、「アプリケーションは既に削除されています」という応答を送信する必要があります。

以下は私がこれまでに持っているもので、ほとんどの場合うまくいきます。場合によっては、遅延が十分でないか、別のウィンドウがフォーカスを奪い、sendkeys の「OK」がウィンドウに届かないことがあります。

--- 完全なソース コード ---

On Error Resume Next
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "taskkill /f /im TEST.App.UI.exe*"
objShell.Run "rundll32.exe dfshim.dll,ShArpMaintain test.app.ui.application, Culture=neutral, PublicKeyToken=f77d770cef, processorArchitecture=msil"



Do Until Success = True
Success = objShell.AppActivate("Test App")
Wscript.Sleep 500
Loop
objShell.SendKeys "OK"

'Commented out on purpose
'install new
'objShell.Run ""
4

1 に答える 1

0

論理制御フローの問題に取り組むときは、ストーリー/説明から始めるのが最善です。

アンインストール プロセスを開始し、それが成功または失敗して終了するのを待ちたい (適切なタイトルのウィンドウを開くことで示される)

条件で 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
于 2012-08-28T22:23:53.867 に答える