Я пишу программу установки / удаления в NSIS для своей игры. Моя игра поддерживает пользовательские моды, и я хочу дать возможность удалять пользовательские моды во время деинсталляции или нет. А теперь самое сложное: моды помещаются в подкаталоги $INSTDIR. Поэтому, если у пользователя есть какие-то моды, которые нужно сохранить, я хочу удалить все, что находится рядом с этим каталогом подмодов (поэтому я не могу использовать простой старый RMdir /R).
Файлы, которые я хочу сохранить, имеют такую структуру:
$INSTDIR/Modules/[anything-but-Base]
$INSTDIR/Modules/Base/Submod
Например, если пользователь решил сохранить свои моды, я хочу сохранить каталоги:
$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 и удаляет все остальное)