VBS脚本 - 直到(成功= True或失败= True)

问题描述:

我试图使用VBS脚本以编程方式卸载ClickOnce应用程序。它工作得很好。但如果卸载失败,我希望它发送一个响应“应用程序已被删除”。VBS脚本 - 直到(成功= True或失败= True)

下面是我到目前为止,它的大部分工作。有时候延迟时间不够长,或者其他窗口占用了焦点,并且sendkeys的“确定”没有使窗口成为窗口。

---完整的源代码---

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 "" 
+0

有什么错误你接收?如何分配objShell?什么是“Uninstsall - 成功”和“卸载 - 失败”?这些应用程序名称是? objShell是WScript.Shell的一个实例吗?我认为你需要发布更多的信息来获得更多建设性的帮助。 –

+0

根据您的建议更新了描述和问题。 – brink668

当解决逻辑控制流的问题,这是最好的开始与 故事/描述:

我要开始了卸载过程,并等待它终止于 成功或失败(通过打开一个窗口,以 适当的标题表示)

切勿在条件下使用与真/假相比较;那只是容易发生错误的脂肪。

不要依赖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和.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