我知道,我知道...停止使用明智。这对我来说并不是真正的选择。我们的盘子上有太多编写全新的安装程序并更改整个构建过程,这是必须做的。

无论如何,问题在于,我们的卸载EXE在卸载时不会删除自身。它位于程序文件文件夹中,在该文件夹中安装了我们的应用程序。卸载器完成后,我们希望删除所有文件并删除应用程序文件夹。取而代之的是,卸载器与App文件夹保持在一起,因为它在运行时似乎无法删除自身。

这似乎是一项基本任务,因为我的计算机上安装的所有其他程序也都卸载了程序文件文件夹中,并且在卸载后将其删除,但是我似乎无法通过Google找到其他任何问题。对我来说,由于当前已加载到内存中,因此无法删除该文件,但是 *抱怨语调 *其他所有人都这样做...我为什么不能?

编辑: 如果有帮助,我正在运行明智的安装工作室7.0,并在Wisescript软件包编辑器中修改卸载脚本。删除程序文件文件夹的部分看起来像 Delete File(s) %MAINDIR%\*.* 其中%maindir%是程序文件中的应用程序夹。此命令有两个可用的选项(两者都打开) - 包括子目录和删除包含文件的目录。

有帮助吗?

解决方案

因此,我最终做的是重新创建更好的安装程序。我有卸载器检查它是否从%temp%目录运行,如果不是,我告诉它将其自身复制到temp文件夹并从那里运行。然后,我通过将其添加到注册表密钥中,将其标记为“温度文件夹”中的一个,以在重新启动中删除:

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

@altie: 您的解决方案可能也可以奏效,但我认为我更喜欢这个解决方案。它似乎更干净,更健壮。但是,非常感谢您提供示例代码...我有时确实编写批处理文件,也不知道循环或“任务列表”命令。这可能在将来有用!

其他提示

如果您找不到其他方法,这是一个肮脏的技巧:在安装程序中迈出最后一步,以启动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 /? 从命令行可以帮助您弄清楚如何根据您的需求进行调整。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top