我正在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目录并删除其他所有内容)
答案 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中没有相同的含义