2

我知道,我知道...停止使用 WISE。这对我来说不是一个真正的选择。我们有太多事情要做,无法编写一个全新的安装程序并更改我们的整个构建过程,这是必须要做的。

无论如何,问题是我们的卸载EXE在卸载时不会自行删除。它位于安装我们的应用程序的 Program Files 文件夹中。卸载程序完成后,我们希望删除所有文件并删除应用文件夹。相反,卸载程序保留在应用程序文件夹中,因为它在运行时似乎无法自行删除。

这似乎是一项基本任务,因为安装在我计算机上的所有其他程序的卸载程序也位于其 Program Files 文件夹中,并且在卸载后被删除,但我似乎无法通过谷歌找到其他有同样问题的人. 对我来说,由于文件当前已加载到内存中,因此无法删除它是有道理的,但是 *呜呜声* 其他人都这样做了……为什么我不能呢?

编辑:如果有帮助,我正在运行 Wise Installation Studio 7.0 并在 WiseScript 包编辑器中修改卸载脚本。删除 Program Files 文件夹的部分看起来像Delete File(s) %MAINDIR%\*.*%MAINDIR% 是 Program Files 中的应用程序文件夹。此命令有两个可用选项(都打开)--包括子目录和删除包含文件的目录。

4

2 回答 2

2

所以我最终做的是重新创建更好的安装人员所做的事情。我让卸载程序检查它是否从 %TEMP% 目录运行,如果不是,我告诉它将自身复制到临时文件夹并从那里运行。然后我将临时文件夹中的一个标记为在重新启动时删除,方法是将其添加到注册表项中:

HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

@altie:您的解决方案可能也可以,但我认为我更喜欢这个解决方案。它看起来更干净,更健壮。但是非常感谢您提供示例代码...我有时会编写批处理文件,但对循环或“任务列表”命令一无所知。这在未来可能会被证明是有用的!

于 2011-01-20T15:56:47.823 回答
1

如果您找不到其他方法来执行此操作,这是一个肮脏的技巧:在安装程序的最后一步启动等待 Wise 进程结束的 cmd.exe,然后将其删除。

如何在带有任务列表的批处理脚本中执行此操作的示例:

rem Expand variables delayed with !! syntax for for loop
setlocal EnableExtensions EnableDelayedExpansion

rem Create a loop with a label and goto
:loopstart
for /F "delims= " %%a in ('tasklist /FI "imagename eq wiseuninstaller.exe"') do (
   if not "%%a"=="INFO: No tasks are running which match the specified criteria." (
      set stillrunning=no
   ) else (
      set stillrunning=yes

      rem Add a 5 second delay with ping and throw out the output.
      ping -n 5 > NUL 2>&1
   )
)

if "!stillrunning!"=="yes" goto :loopstart

del wiseuninstaller.exe

我还没有测试过这段代码,也没有检查过它的语法错误,但它已经很接近了。 for /?并且tasklist /?从命令行可以帮助您弄清楚如何根据您的需要进行调整。

于 2011-01-18T18:25:32.630 回答