diff --git a/files/experimental/software-management-tool.bat b/files/experimental/software-management-tool.bat index 7033506..4264967 100644 --- a/files/experimental/software-management-tool.bat +++ b/files/experimental/software-management-tool.bat @@ -422,12 +422,14 @@ echo ======================================== echo. echo [1] View installed programs echo [2] Uninstall by name +echo [3] Select programs to uninstall (interactive) echo [0] Back to menu echo. set /p UNINSTALL_CHOICE="Select option: " if "%UNINSTALL_CHOICE%"=="1" goto VIEW_FOR_UNINSTALL if "%UNINSTALL_CHOICE%"=="2" goto UNINSTALL_BY_NAME +if "%UNINSTALL_CHOICE%"=="3" goto SELECT_UNINSTALL if "%UNINSTALL_CHOICE%"=="0" goto MENU goto UNINSTALL_SOFTWARE @@ -472,6 +474,204 @@ del "%tempfile%" >nul 2>&1 pause goto UNINSTALL_SOFTWARE +:SELECT_UNINSTALL +cls +echo ======================================== +echo Select Programs to Uninstall +echo ======================================== +echo. +echo Scanning installed programs... +echo. + +REM Collect all programs directly into arrays +set INDEX=0 +set "templist=%TEMP%\prog_temp_%RANDOM%.txt" + +echo Collecting 64-bit programs... +reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 2>nul > "%templist%" +for /f "tokens=*" %%a in ('type "%templist%"') do ( + reg query "%%a" /v DisplayName 2>nul | findstr "DisplayName" >nul + if !errorlevel!==0 ( + for /f "skip=2 tokens=2*" %%b in ('reg query "%%a" /v DisplayName 2^>nul') do ( + set /a INDEX+=1 + set "PROG_NAME_!INDEX!=%%c" + set "PROG_REG_!INDEX!=%%a" + set "SELECTED_!INDEX!=0" + ) + ) +) + +echo Collecting 32-bit programs... +reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 2>nul > "%templist%" +for /f "tokens=*" %%a in ('type "%templist%"') do ( + reg query "%%a" /v DisplayName 2>nul | findstr "DisplayName" >nul + if !errorlevel!==0 ( + for /f "skip=2 tokens=2*" %%b in ('reg query "%%a" /v DisplayName 2^>nul') do ( + set /a INDEX+=1 + set "PROG_NAME_!INDEX!=%%c" + set "PROG_REG_!INDEX!=%%a" + set "SELECTED_!INDEX!=0" + ) + ) +) + +echo Collecting user programs... +reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 2>nul > "%templist%" +for /f "tokens=*" %%a in ('type "%templist%"') do ( + reg query "%%a" /v DisplayName 2>nul | findstr "DisplayName" >nul + if !errorlevel!==0 ( + for /f "skip=2 tokens=2*" %%b in ('reg query "%%a" /v DisplayName 2^>nul') do ( + set /a INDEX+=1 + set "PROG_NAME_!INDEX!=%%c (User)" + set "PROG_REG_!INDEX!=%%a" + set "SELECTED_!INDEX!=0" + ) + ) +) + +del "%templist%" >nul 2>&1 +echo. +echo Found !INDEX! programs total. + +if %INDEX%==0 ( + echo No programs found! + pause + goto UNINSTALL_SOFTWARE +) + +set CURRENT=1 +set TOTAL=%INDEX% + +:DISPLAY_SELECTION +cls +echo ======================================== +echo Select Programs to Uninstall +echo ======================================== +echo. +echo Enter the numbers of programs to uninstall (separated by spaces) +echo Example: 1 3 5 7 +echo Or press 0 to cancel +echo. +echo ---------------------------------------- +echo. + +REM Display all programs with numbers +for /l %%i in (1,1,%TOTAL%) do ( + echo [%%i] !PROG_NAME_%%i! +) + +echo. +echo ---------------------------------------- +set /p SELECTIONS="Enter numbers (space-separated) or 0 to cancel: " + +if "%SELECTIONS%"=="0" goto CANCEL_SELECTION +if "%SELECTIONS%"=="" goto DISPLAY_SELECTION + +REM Mark selected programs +for %%S in (%SELECTIONS%) do ( + if defined PROG_NAME_%%S ( + set "SELECTED_%%S=1" + ) +) + +goto CONFIRM_SELECTION + +:CANCEL_SELECTION +goto UNINSTALL_SOFTWARE + +:CONFIRM_SELECTION +REM Check if any programs selected +set SELECTED_COUNT=0 +for /l %%i in (1,1,%TOTAL%) do ( + if !SELECTED_%%i!==1 set /a SELECTED_COUNT+=1 +) + +if %SELECTED_COUNT%==0 ( + echo. + echo [WARNING] No valid programs selected! + timeout /t 2 >nul + goto CANCEL_SELECTION +) + +cls +echo ======================================== +echo Confirm Uninstallation +echo ======================================== +echo. +echo The following programs will be uninstalled: +echo. + +for /l %%i in (1,1,%TOTAL%) do ( + if !SELECTED_%%i!==1 ( + echo - !PROG_NAME_%%i! + ) +) + +echo. +echo ======================================== +set /p CONFIRM="Are you sure? (Y/N): " + +if /i not "%CONFIRM%"=="Y" goto CANCEL_SELECTION + +cls +echo ======================================== +echo Uninstalling Selected Programs +echo ======================================== +echo. + +set "logfile=%TEMP%\\uninstall_log_%RANDOM%.log" + +( +echo ======================================== +echo UNINSTALL LOG +echo Date: %date% %time% +echo ======================================== +echo. +) > "%logfile%" + +REM Uninstall selected programs +for /l %%i in (1,1,%TOTAL%) do ( + if !SELECTED_%%i!==1 ( + echo ---------------------------------------- >> "%logfile%" + echo Uninstalling: !PROG_NAME_%%i! >> "%logfile%" + echo Registry: !PROG_REG_%%i! >> "%logfile%" + echo ---------------------------------------- >> "%logfile%" + echo Uninstalling: !PROG_NAME_%%i! + + REM Try to get uninstall string + for /f "skip=2 tokens=2*" %%u in ('reg query "!PROG_REG_%%i!" /v UninstallString 2^>nul') do ( + echo Uninstall command: %%v >> "%logfile%" + + REM Execute uninstall + echo Running uninstaller... >> "%logfile%" + start /wait "" %%v >> "%logfile%" 2>&1 + + if !errorlevel!==0 ( + echo [SUCCESS] Uninstalled successfully >> "%logfile%" + echo [SUCCESS] Uninstalled successfully + ) else ( + echo [WARNING] Uninstall may have failed or was cancelled >> "%logfile%" + echo [WARNING] Uninstall may have failed or was cancelled + ) + ) + + echo. >> "%logfile%" + ) +) + +echo ======================================== >> "%logfile%" +echo Uninstall process completed. >> "%logfile%" + +cls +type "%logfile%" +echo. + +if /i "%ENABLE_EXPORT%"=="Y" call :EXPORT_FILE "%logfile%" "Uninstall_Selected" + +del "%logfile%" >nul 2>&1 +pause +goto MENU + :UNINSTALL_BY_NAME cls echo ========================================