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 ""
答
当解决逻辑控制流的问题,这是最好的开始与 故事/描述:
我要开始了卸载过程,并等待它终止于 成功或失败(通过打开一个窗口,以 适当的标题表示)
切勿在条件下使用与真/假相比较;那只是容易发生错误的脂肪。
不要依赖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
有什么错误你接收?如何分配objShell?什么是“Uninstsall - 成功”和“卸载 - 失败”?这些应用程序名称是? objShell是WScript.Shell的一个实例吗?我认为你需要发布更多的信息来获得更多建设性的帮助。 –
根据您的建议更新了描述和问题。 – brink668