我知道,我知道......停止使用WISE。这对我来说不是一个真正的选择。我们有太多的东西来编写一个全新的安装程序并更改我们的整个构建过程,这是必须要做的。
无论如何,问题是我们的卸载EXE在卸载时不会自行删除。它位于Program Files文件夹中,我们的应用程序安装在该文件夹中。卸载程序完成后,我们希望删除所有文件并删除app文件夹。相反,卸载程序仍然与app文件夹一起使用,因为它在运行时似乎无法自行删除。
这似乎是一项基本任务,因为我计算机上安装的所有其他程序的卸载程序也都位于Program Files文件夹中,卸载后会将其删除,但我似乎无法找到其他人通过谷歌的问题。我有意义的是,文件无法删除,因为它当前已加载到内存中,但*抱怨音*其他人都这样做...为什么我不能?
编辑:如果有帮助,我正在运行Wise Installation Studio 7.0并在WiseScript包编辑器中修改卸载脚本。删除Program Files文件夹的部分看起来像Delete File(s) %MAINDIR%\*.*
,其中%MAINDIR%是Program Files中的app文件夹。此命令有两个可用选项(两个都打开) - 包括子目录和删除包含文件的目录。
答案 0 :(得分:2)
所以我最终做的是重新创建更好的安装程序。我有卸载程序检查它是否从%TEMP%目录运行,如果不是,我告诉它将自己复制到临时文件夹并从那里运行自己。然后,我将temp文件夹中的那个标记为在重新引导时删除,方法是将其添加到注册表项:
HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
@altie:您的解决方案可能也会有效,但我认为我更喜欢这种解决方案。它看起来更干净,更健壮。但非常感谢您提供示例代码...我偶尔会编写批处理文件,并且不知道循环或“tasklist”命令。这可能在将来证明是有用的!
答案 1 :(得分:1)
如果你找不到其他方法,这里有一个肮脏的伎俩:在安装程序的最后一步触发一个等待你的Wise进程结束的cmd.exe,然后删除它。
如何在带有tasklist的批处理脚本中执行此操作的示例:
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 /?
可以帮助您弄清楚如何根据您的需要进行调整。