【问题标题】:RMDir /r leaves the directory empty - but don't removes itRMDir /r 将目录留空 - 但不要删除它
【发布时间】:2014-03-12 23:41:48
【问题描述】:

我有一个带有 RMDir /r 指令的 NSIS 脚本,它没有删除目标目录(它只是清空它)。

$ makensis -version
v16-Dec-2013.cvs
$ pwd
/Users/mgarciaisaia/.wine/drive_c
$ ls
Program Files   users       windows
$ wine ~/InstallerTest.exe 
$ ls
InstallerTest   Program Files   users       windows
$ find InstallerTest
InstallerTest
InstallerTest/SomeData
InstallerTest/SomeData/some-file.txt
InstallerTest/SomeData/Uninstall.exe
$ wine InstallerTest/SomeData/Uninstall.exe 
$ ls
InstallerTest   Program Files   users       windows
$ find InstallerTest
InstallerTest

问题不在于在 MacOSX 中使用 wine(Windows 上也是如此)。

我已将我的 installer.nsi 修剪为这个示例:

  !addplugindir nsis
  !define MUI_PRODUCT "InstallerTest"
  CRCCheck On
  !include "MUI2.nsh"
  Name "${MUI_PRODUCT}"
  BrandingText "${MUI_PRODUCT}"

  OutFile "InstallerTest.exe"

  ShowInstDetails "nevershow"
  ShowUninstDetails "nevershow"

  !define SOME_DATA "C:\InstallerTest\SomeData"

  !define MUI_ABORTWARNING
  Caption "${MUI_PRODUCT} Installer"
  !insertmacro MUI_PAGE_INSTFILES

  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_LANGUAGE "English"

Section "Install" Install
  DetailPrint "Installing..."

  SetOutPath "${SOME_DATA}"
  File "some-file.txt"
  WriteUninstaller "${SOME_DATA}\Uninstall.exe"
SectionEnd

Section "un.Remove InstallTest"
  DetailPrint "Removing..."

;Delete Files
  RMDir /r "${SOME_DATA}"
  Delete "${SOME_DATA}\Uninstall.exe"
SectionEnd

我做错了什么?

【问题讨论】:

  • 你为什么使用一些随机版本?当前的 alpha 版本应该比 2013 年的任何版本都好。
  • @Anders:我正在使用 Homebrew 中可用的当前 makensis 版本 - 这不是 随机的。
  • 在 v2.46 和 v3.0a2 之间有很多时间点主干中的代码被破坏或错误,我不建议使用那个时代的快照。 v16-Dec-2013.cvs 可能属于这一类。

标签: installation nsis uninstallation


【解决方案1】:

Delete "$INSTDIR\Uninstall.exe" 放在RMDir 之前,而不是之后。

编辑:

如果其他程序有文件夹的打开句柄或文件夹内的某些东西,则 RMDir 将无法删除它。

在 Windows 上,我会告诉您使用 Sysinternals Process Monitor 来查看删除失败的原因,我不知道这是否可以在 WINE 下工作,或者您的“主机操作系统”是否以某种方式阻止了删除...

【讨论】:

  • 这没什么区别 :/ (即使是 Delete "${SOME_DATA}\Uninstall.exe",应该这样)
  • RMDir 和 Delete 都应该在实际情况下使用 $instdir,而不是在本地机器上定义路径。
  • 重点是在我的真实案例中,我试图删除应用程序的一些需要位于$INSTDIR之外的数据目录。这是一项要求,对此我别无选择。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
相关资源
最近更新 更多