;----------------------------------------------------------------------------------------------- ; Generate list of files and directories for uninstaller with command line support (/? for help) ; ; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) ;----------------------------------------------------------------------------------------------- Name "UnList" OutFile "UnList.exe" !include "FileFunc.nsh" !insertmacro GetFileName !insertmacro GetParameters !insertmacro GetOptions !insertmacro GetExePath !include "TextFunc.nsh" !insertmacro FileReadFromEnd !insertmacro FileJoin !insertmacro TrimNewLines Var LOG Var FILE_PREFIX Var DIR_PREFIX Page directory Page instfiles Function .onInit ${GetExePath} $EXEDIR ${GetParameters} $0 StrCmp $0 '/?' +2 StrCmp $0 '-?' 0 GetOptions MessageBox MB_OK `| Command line options:$\n\ | $\n\ | /INSTDIR=[path] Get file list from this path$\n\ | default: [exe directory]\$\n\ | /LOG=[file] Ouput file list$\n\ | default: [exe directory]\UnList.txt$\n\ | /FILE_PREFIX=[text] Prefix before founded path\file$\n\ | default: Delete "$$INSTDIR\$\n\ | /DIR_PREFIX=[text] Prefix before founded path\dir$\n\ | default: RMDIR "$$INSTDIR\$\n\ | $\n\ | $\n\ | Example:$\n\ | UnList.exe /INSTDIR=C:\a /LOG=C:\a\a.log /FILE_PREFIX=' Delete "$$R0\'$\n\ | /DIR_PREFIX=' RMDir "$$R0\'` quit GetOptions: ${GetOptions} '$0' '/' 'INSTDIR=' $1 StrCmp $1 '' 0 +3 StrCpy $INSTDIR '$EXEDIR\' goto +2 StrCpy $INSTDIR $1 ${GetOptions} '$0' '/' 'LOG=' $1 StrCmp $1 '' 0 +3 StrCpy $LOG '$EXEDIR\UnList.txt' goto +2 StrCpy $LOG $1 ${GetOptions} '$0' '/' 'FILE_PREFIX=' $1 StrCmp $1 '' 0 +3 StrCpy $FILE_PREFIX `Delete "$$INSTDIR\` goto +2 StrCpy $FILE_PREFIX $1 ${GetOptions} '$0' '/' 'DIR_PREFIX=' $1 StrCmp $1 '' 0 +3 StrCpy $DIR_PREFIX `RMDIR "$$INSTDIR\` goto +2 StrCpy $DIR_PREFIX $1 StrCmp $0 '' end call main quit end: FunctionEnd Function main StrLen $R1 $INSTDIR IntOp $R1 $R1 + 1 ReadRegStr $0 HKLM "System\CurrentControlSet\Control\SessionManager\Environment" "COMSPEC" IfErrors 0 +4 ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "ComSpec" IfErrors 0 +2 MessageBox MB_OK "error" IDOK quit ${GetFileName} '$0' $0 GetTempFileName $1 GetTempFileName $2 GetTempFileName $3 nsExec::Exec '"$0" /C DIR "$INSTDIR" /A-D /B /S /ON>"$1"' FileOpen $R0 $2 w ${FileReadFromEnd} '$1' FilesCallback FileClose $R0 nsExec::Exec '"$0" /C DIR "$INSTDIR" /AD /B /S /ON>"$1"' FileOpen $R0 $3 w ${FileReadFromEnd} '$1' DirectoriesCallback FileClose $R0 ${FileJoin} '$2' '$3' '$2' Delete $1 Delete $3 Delete $LOG Rename $2 $LOG quit: quit FunctionEnd Function FilesCallback System::Call 'user32::OemToChar(t r9, t .r9)' ${TrimNewLines} '$9' $9 StrCpy $9 $9 '' $R1 FileWrite $R0 `$FILE_PREFIX$9"$\r$\n` Push 0 FunctionEnd Function DirectoriesCallback System::Call 'user32::OemToChar(t r9, t .r9)' ${TrimNewLines} '$9' $9 StrCpy $9 $9 '' $R1 FileWrite $R0 `$DIR_PREFIX$9"$\r$\n` Push 0 FunctionEnd Section call main SectionEnd