如何递归删除目录内容而不删除特定的子目录

时间:2014-04-09 08:57:48

标签: nsis

我正在NSIS为我的游戏编写安装程序/卸载程序。我的游戏支持自定义mods,我想在卸载期间删除自定义mod时给出一个选项。现在是棘手的部分:mods放在$INSTDIR的子目录中。因此,如果用户有一些mod要保留,我想删除该子目录旁边的所有内容(所以我不能使用普通的RMdir /R}。

我想要保留的文件具有以下结构:

$INSTDIR/Modules/[anything-but-Base]
$INSTDIR/Modules/Base/Submod

例如,如果用户决定保留他的mod,我想保留目录:

$INSTDIR/Modules/Base/Submod/Sample1
$INSTDIR/Modules/Base/Submod/Sample2
$INSTDIR/Modules/Base/Submod
$INSTDIR/Modules/Sample3
$INSTDIR/Modules/Sample4

并从$INSTDIR中移除所有其他内容,包括空目录

我试过这样的事情:

FindFirst $R0 $R1 "$INSTDIR\Modules\Base\*.*"
Loop:
    StrCmp $R1 "" Done
    StrCmp $R1 "Submod" DeleteSubMods
    Goto DeleteCoreMod
    DeleteSubMods:
        RMdir "$INSTDIR/Modules/Base/Submod" ; Remove only if empty
        Goto FindNextItem
    DeleteCoreMod:
        RMdir /R "$INSTDIR/Modules/Base/$R1" ; Remove always
    FindNextItem:
    FindNext $R0 $R1
    Goto Loop
Done:
FindClose $0

RMdir "$INSTDIR/Modules/Base" ; Only if empty
RMdir "$INSTDIR/Modules" ; Only if empty

FindFirst $R0 $R1 "$INSTDIR\*.*"
Loop2:
    StrCmp $R1 "" Done2
    StrCmp $R1 "Modules" FindNextItem2 ; Remove everything but Modules
        RMdir /R "$INSTDIR/$R1"
        Delete "$INSTDIR/$R1"
    FindNextItem2:
    FindNext $R0 $R1
    Goto Loop2
Done2:
FindClose $0

但它没有给我正确的结果(它留下空的$ INSTDIR / Modules目录并删除其他所有内容)

2 个答案:

答案 0 :(得分:0)

如何仅删除您的文件?

我认为在安装过程中你会做类似A)的事情

SetOutDir $INSTDIR
File "*.*"

如何逐个创建所有文件的列表B)

SetOutDir $INSTDIR
File "1"
File "2"
File "3"
File "4"
File "n"

在B)中,为卸载程序创建相同的列表(在“卸载”部分中)。 因此,只会删除您的文件,并且mod文件保持不变。

使用RMdir(不带/ r)删除目录 - 只有当它们完全为空时才会被删除,因此你的mod将被保留。

最后一个问题:如果没有游戏,有没有没用的东西?我认为他们不会工作......

答案 1 :(得分:0)

在NSIS维基上有这个:http://nsis.sourceforge.net/Delete_dirs_/_files_in_a_directory_except_one_dir_/_file片段,我能够根据自己的需要进行调整(忘记了NSIS wiki)。基本上核心问题是我可以互换地使用/和\,这些在NSIS中没有相同的含义