Scripting VBS脚本-执行直到(成功=真或失败=真)

Scripting VBS脚本-执行直到(成功=真或失败=真),scripting,vbscript,clickonce,Scripting,Vbscript,Clickonce,我正在尝试使用VBS脚本以编程方式卸载ClickOnce应用程序。它工作得很好。但如果卸载失败,我希望它发送一个响应“应用程序已被删除” 下面是我到目前为止所做的,它在很大程度上是有效的。有时延迟不够长,或者另一个窗口窃取焦点,sendkeys的“OK”无法到达窗口 ---完整源代码--- 在处理逻辑控制流问题时,最好从 故事/描述: 我想启动卸载过程,并等待它终止 成功或失败(通过打开带有 (适当标题) 切勿在任何情况下对真/假进行比较;这是很容易出错的 胖 不要依赖VBscript的智能来转

我正在尝试使用VBS脚本以编程方式卸载ClickOnce应用程序。它工作得很好。但如果卸载失败,我希望它发送一个响应“应用程序已被删除”

下面是我到目前为止所做的,它在很大程度上是有效的。有时延迟不够长,或者另一个窗口窃取焦点,sendkeys的“OK”无法到达窗口

---完整源代码---


在处理逻辑控制流问题时,最好从 故事/描述:

我想启动卸载过程,并等待它终止 成功或失败(通过打开带有 (适当标题)

切勿在任何情况下对真/假进行比较;这是很容易出错的 胖

不要依赖VBscript的智能来转换非布尔值;使用 条件句中适当(子)类型的变量/表达式

请记住,VBScript不会缩短条件的计算:

If This() Or That() Then
将调用这两个函数,即使返回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和.SendKey是每个程序员的敌人;推迟战斗 直到控制流问题得到解决

代码:

  '          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

你收到了什么错误?objShell是如何分配的?什么是“卸载成功”和“卸载失败”?那些是应用程序名称吗?objShell是WScript.Shell的实例吗?我认为你需要发布更多的信息源以获得更多建设性的帮助。根据你的建议更新描述和问题。
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