我有脚本使用它的uninstallstring(即setup.exe -remove)卸载包pkg_1。之后,它试图删除另一个包,说pkg_2。卸载pkg_1大约需要1到2分钟。脚本如下所示
rc = shellobj.Run("cmd /C " & uninstall_string_1 & " /silent",0, true)
rc1 = shellobj.Run("cmd /C " & uninstall_string_2 & " /silent",0, true)
这就是我的问题,如果你在上面两个语句之间放置WScript.sleep(120000),这两个包都会被成功删除。否则,将停止卸载pkg_1,并立即开始卸载pkg_2。结果只有pkg_2被删除(没有睡眠)。
如何在不使用sleep方法的情况下卸载两个软件包?
FYI 如果从命令提示符运行uninstall_string_1,则在0-5秒后将启用新提示,并在后台继续卸载
答案 0 :(得分:0)
当我们使用脚本来安装或卸载软件包时,它很大程度上取决于软件包的实现。让我们说setup.exe本身作为进程A运行。进程A执行一些名义验证,然后生成进程B,即真正的安装引擎,然后自行关闭。在这种情况下,bWaitOnReturn(在代码中设置为true)已完成其工作,控件将移交给下一个语句。但是,进程B仍在运行。这不受bWaitOnReturn的控制。因此,您的第二个包将在您的第一个包实际完成之前开始。也许您的第一个包实际上没有停止,可能需要时间并在后台执行。无论如何,这只是猜测。
如果不是这样,你也可以试试这个:
Set obj0 = CreateObject("WScript.Shell")
Set objExec = obj0.Exec("your package../../")
' We will set a loop until finished
Do While objExec.Status <> 1
WScript.Sleep 100
Loop
因此,每100ms脚本将检查您的包是否已完成执行。如果有,它将转到下一个声明。
答案 1 :(得分:0)
试试这个:
strCmd = uninstall_string_1 & " & " & uninstall_string_2
rc = shellObj.Run("cmd /C " & strCmd, 0, True)