NSIS-删除除一个文件外的所有文件

NSIS-删除除一个文件外的所有文件,nsis,Nsis,有谁能告诉我,卸载时,我需要删除安装文件夹中除许可证文件以外的所有内容。如何使用NSIS脚本编写 谢谢 当做 RoboAlex。在我的脑海中,有三种方法可以做到这一点: 在编译时生成的列表中,使用Delete一次删除一个文件!系统等 在运行时使用/FindNext/FindClose,并根据文件名删除除许可证之外的所有内容 有点黑客行为,但您应该能够打开许可证文件进行写入/附加,然后Delete/RMDir将无法删除该文件,因为它有一个打开的句柄 我不会像Anders的第三点那样打开文件,而是

有谁能告诉我,卸载时,我需要删除安装文件夹中除许可证文件以外的所有内容。如何使用NSIS脚本编写

谢谢 当做
RoboAlex。

在我的脑海中,有三种方法可以做到这一点:

  • 在编译时生成的列表中,使用Delete一次删除一个文件!系统等
  • 在运行时使用/FindNext/FindClose,并根据文件名删除除许可证之外的所有内容
  • 有点黑客行为,但您应该能够打开许可证文件进行写入/附加,然后Delete/RMDir将无法删除该文件,因为它有一个打开的句柄

我不会像Anders的第三点那样打开文件,而是这样做:

Rename $INSTDIR\license.txt $PLUGINSDIR\license.txt
RMDir /R $INSTDIR # Remembering, of course, that you should do this with care
CreateDirectory $INSTDIR
Rename $PLUGINSDIR\license.txt $INSTDIR\license.txt
取决于它何时到达无法删除的文件,
RMDir/R
可能会留下大部分,因为我相信当它无法删除某些内容时,它会停止;这样就可以完全摆脱它。这也会丢失目录统计信息,但这可能并不重要


不过,我还是推荐安德斯的前两个解决方案之一。它们更精确。

我不认为在文件上打开一个句柄可以达到预期的效果——它会让其他东西落在后面。@Chris Morgan效果很好:你认为会落在后面什么?RMDir/r实际上不应该被使用,所以我不确定这是否就是您所说的
RMDir/r
就是我所说的。使用
Delete
它将按需要工作。非常感谢Anders。你能详细说明一下你的第一个建议吗?因为我找不到。你只需要一个删除列表。如果您安装的文件列表很大,您可能需要调用一些外部脚本!这个脚本将生成一个.nsh文件,其中包含了主脚本中包含的全部删除命令。如果驱动器上没有足够的空间存放$pluginsdir,会怎么样$PLUGINSDIR不必与$INSTDIR位于同一个驱动器上(当然,许可证文件可能不是很大,但其他文件可能很大),我忘记了它位于不同驱动器上的情况-重命名无论如何都无法跨卷工作!NSIS文档对重命名命令有这样的描述:“您可以使用它将文件从系统上的任何位置移动到其他任何位置,也可以将目录移动到同一驱动器上的其他位置”