@echo off setlocal enabledelayedexpansion cls :: SRB2 Install Staging :: :: This accomplishes the following tasks: :: :: 1. Creates a user profile folder if SRB2 is installed in AppData or Program Files, and config.cfg is not already in the install folder :: :: 2. Moves old installation files into old-install :: :: 3. Moves new installaton files into install folder :: :: Get Parent folder (the SRB2 install folder) :: :: https://wiert.me/2011/08/30/batch-file-to-get-parent-directory-not-the-directory-of-the-batch-file-but-the-parent-of-that-directory/ set "STAGINGDIR=%~dp0" :: strip trailing backslash set "STAGINGDIR=!STAGINGDIR:~0,-1!" :: ~dp only works for batch file parameters and loop indexes for %%d in ("!STAGINGDIR!") do set "INSTALLDIR=%%~dpd" set "INSTALLDIR=!INSTALLDIR:~0,-1!" :: Find 7z set SVZIP= if ["%SVZIP%"] == [""] ( if exist "!ProgramFiles(x86)!\7-Zip\7z.exe" set "SVZIP=!ProgramFiles(x86)!\7-Zip\7z.exe" if exist "!ProgramFiles!\7-Zip\7z.exe" set "SVZIP=!ProgramFiles!\7-Zip\7z.exe" if exist "!ProgramW6432!\7-Zip\7z.exe" set "SVZIP=!ProgramW6432!\7-Zip\7z.exe" ) :: Is it in PATH? if ["%SVZIP%"] == [""] ( "7z.exe" --help > NUL 2> NUL if NOT errorlevel 1 ( set "SVZIP=7z.exe" ) ) :: FAILSAFE: Check if staging.txt exists in the directory :: If not, exit, so we don't mess up anything by accident. if NOT exist "!STAGINGDIR!\staging.txt" ( exit ) : CheckPermissionsInstall :: Write a dummy file and check for an error. If error, we need administrator rights :: NOTE: We should never have to deal with this because the main installer should :: already have the rights. mkdir "!INSTALLDIR!\install-dummy" :: TODO elevate automatically if errorlevel 1 ( echo Finish installing SRB2 with these steps: echo. echo 1. Go to your SRB2 install folder echo. echo !INSTALLDIR! echo. echo 2. Copy all files from the "new-install" subfolder into the main folder echo and DELETE staging.bat and staging.txt!!! echo. echo 3. Optionally, create a folder in your user profile named "SRB2". echo This is where your game data and addons may live. echo To create the folder, go here: echo. echo !USERPROFILE! echo. echo If anything fails, you may delete the files and try to run the installer echo again with Administrator Rights: Right-click on the icon and click echo "Run as administrator." echo. "!SystemRoot!\explorer.exe" "!INSTALLDIR!" set /p ADMINFINAL="Press Enter key to exit. " exit ) else ( rmdir /s /q "!INSTALLDIR!\install-dummy" goto CheckUserDir ) : CheckUserDir :: Check if we need to create !userprofile!\SRB2 set "USERDIR=!INSTALLDIR!" :: Is config.cfg in our install dir? if exist "!INSTALLDIR!\config.cfg" goto MoveOldInstall :: Are we in AppData? echo.!STAGINGDIR! | findstr /C:"!LocalAppData!" 1>nul if errorlevel 1 ( echo. ) else ( goto SetUserDir ) : Are we in Program Files? echo.!STAGINGDIR! | findstr /C:"!ProgramFiles!" 1>nul if NOT errorlevel 1 ( goto SetUserDir ) :: Are we in Program Files (x86)? echo.!STAGINGDIR! | findstr /C:"!ProgramFiles(X86)!" 1>nul if NOT errorlevel 1 ( goto SetUserDir ) :: Are we 32-bit and actually in Program Files? echo.!STAGINGDIR! | findstr /C:"!ProgramW6432!" 1>nul if NOT errorlevel 1 ( goto SetUserDir ) goto MoveOldInstall : SetUserDir : CheckPermissionsUserDir set "USERDIR=!UserProfile!\SRB2" :: Check for permissions and create the folder if exist "!USERDIR!\*" ( mkdir "!USERDIR!\install-dummy" if errorlevel 1 ( echo User profile folder exists, but we won't operate on it. echo. goto MoveOldInstall ) else ( rmdir /s /q "!USERDIR!\install-dummy" ) ) else ( mkdir "!USERDIR!" if errorlevel 1 ( echo Could not create user profile folder echo Defaulting to install dir: "!INSTALLDIR!" echo. set "USERDIR=!INSTALLDIR!" goto MoveOldInstall ) ) :: Now copy READMEs :: echo f answers xcopy's prompt as to whether the destination is a file or a folder echo f | xcopy /y "!STAGINGDIR!\README.txt" "!USERDIR!\README.txt" echo f | xcopy /y "!STAGINGDIR!\LICENSE.txt" "!USERDIR!\LICENSE.txt" echo f | xcopy /y "!STAGINGDIR!\LICENSE-3RD-PARTY.txt" "!USERDIR!\LICENSE-3RD-PARTY.txt" echo Your game data and mods folder is: > "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo !USERDIR! >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo Your install folder is: >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo !INSTALLDIR! >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo To run SRB2, go to: >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" echo Start Menu ^> Programs ^> Sonic Robo Blast 2 >> "!USERDIR!\^! Data and Mods Go Here ^!.txt" :: Copy path to install folder set "SCRIPT=!TEMP!\!RANDOM!-!RANDOM!-!RANDOM!-!RANDOM!.vbs" echo Set oWS = WScript.CreateObject("WScript.Shell") >> "!SCRIPT!" echo sLinkFile = "!USERDIR!\^! SRB2 Install Folder ^!.lnk" >> "!SCRIPT!" echo Set oLink = oWS.CreateShortcut(sLinkFile) >> "!SCRIPT!" echo oLink.TargetPath = "!INSTALLDIR!" >> "!SCRIPT!" echo oLink.WorkingDirectory = "!INSTALLDIR!" >> "!SCRIPT!" echo oLink.Arguments = "" >> "!SCRIPT!" echo oLink.IconLocation = "!INSTALLDIR!\srb2win.exe,0" >> "!SCRIPT!" echo oLink.Save >> "!SCRIPT!" cscript /nologo "!SCRIPT!" del "!SCRIPT!" :: Also do it the other way around set "SCRIPT=!TEMP!\!RANDOM!-!RANDOM!-!RANDOM!-!RANDOM!.vbs" echo Set oWS = WScript.CreateObject("WScript.Shell") >> "!SCRIPT!" echo sLinkFile = "!INSTALLDIR!\^! SRB2 Data Folder ^!.lnk" >> "!SCRIPT!" echo Set oLink = oWS.CreateShortcut(sLinkFile) >> "!SCRIPT!" echo oLink.TargetPath = "!USERDIR!" >> "!SCRIPT!" echo oLink.WorkingDirectory = "!USERDIR!" >> "!SCRIPT!" echo oLink.Arguments = "" >> "!SCRIPT!" echo oLink.IconLocation = "!INSTALLDIR!\srb2win.exe,0" >> "!SCRIPT!" echo oLink.Save >> "!SCRIPT!" cscript /nologo "!SCRIPT!" del "!SCRIPT!" : MoveOldInstall if exist "!INSTALLDIR!\old-install\*" ( set "OLDINSTALLDIR=!INSTALLDIR!\old-install-!RANDOM!" ) else ( set "OLDINSTALLDIR=!INSTALLDIR!\old-install" ) mkdir "!OLDINSTALLDIR!" :: :: Move all old install files :: We support a list of explicit files to copy to old-install :: And later, we also loop through our staging files, look for the pre-existing copy in :: install root, then copy that also to old-install :: :: Extract the uninstall-list.txt and uninstall-userdir.txt files from uninstaller.exe :: if it exists if exist "!INSTALLDIR!\uninstall.exe" ( if NOT ["!SVZIP!"] == [""] ( "!SVZIP!" x "!INSTALLDIR!\uninstall.exe" "uninstall-list.txt" -o"!INSTALLDIR!" "!SVZIP!" x "!INSTALLDIR!\uninstall.exe" "uninstall-userdir.txt" -o"!INSTALLDIR!" ) ) set OLDINSTALLCHANGED= if exist "!STAGINGDIR!\old-install-list.txt" ( goto MoveOldInstallOldFiles ) else ( goto MoveOldInstallNewFiles ) : MoveOldInstallOldFiles set "TESTFILE=!TEMP!\!RANDOM!.txt" :: Do our failsafes before copying the file in the list :: See uninstall.bat for details for /F "usebackq tokens=*" %%A in ("!STAGINGDIR!\old-install-list.txt") do ( if exist "!INSTALLDIR!\%%A" ( if NOT ["%%A"] == [""] ( if NOT ["%%A"] == ["%~nx0"] ( echo %%A> "!TESTFILE!" findstr /r ".*[<>:\"\"/\\|?*%%].*" "!TESTFILE!" >nul if !errorlevel! equ 0 ( echo %%A has invalid characters, skipping... ) else ( if exist "!INSTALLDIR!\%%A\*" ( echo %%A is a folder, skipping... ) else ( echo Moving !INSTALLDIR!\%%A to "old-install" folder echo f | xcopy /y /v "!INSTALLDIR!\%%A" "!OLDINSTALLDIR!\%%A" if errorlevel 0 del /f /q "!INSTALLDIR!\%%A" ) ) ) ) ) ) del /q /f "!STAGINGDIR!\old-install-list.txt" for %%F in ("!OLDINSTALLDIR!\*") DO ( set OLDINSTALLCHANGED=1 goto MoveOldInstallNewFiles ) : MoveOldInstallNewFiles :: Save a list of standard files :: So the uninstall script will know what to remove :: Append to any existing file, in case we are a patch dir /b /a-d "!STAGINGDIR!" >> "!INSTALLDIR!\uninstall-list.txt" :: Overwrite the last known gamedata folder echo !USERDIR! > "!INSTALLDIR!\uninstall-userdir.txt" :: Add the install-generated to the uninstall list :: NO FOLLOWING SPACES AFTER THE FILENAME!!! echo uninstall.bat>> "!INSTALLDIR!\uninstall-list.txt" echo uninstall-list.txt>> "!INSTALLDIR!\uninstall-list.txt" echo uninstall-userdir.txt>> "!INSTALLDIR!\uninstall-list.txt" :: *ahem* Prints as ^! SRB2 Data Folder ^!.lnk :: We need to escape the exclamations (^^!) and the carets themselves (^^^^) echo ^^^^^^! SRB2 Data Folder ^^^^^^!.lnk>> "!INSTALLDIR!\uninstall-list.txt" :: Add the uninstall list files to the uninstall EXE if NOT ["!SVZIP!"] == [""] ( if exist "!INSTALLDIR!\new-install\uninstall.exe" ( "!SVZIP!" a "!INSTALLDIR!\new-install\uninstall.exe" "!INSTALLDIR!\uninstall-list.txt" -sdel "!SVZIP!" a "!INSTALLDIR!\new-install\uninstall.exe" "!INSTALLDIR!\uninstall-userdir.txt" -sdel ) ) :: Start moving files for %%F in ("!STAGINGDIR!\*") DO ( if exist "!INSTALLDIR!\%%~nxF" ( set OLDINSTALLCHANGED=1 move "!INSTALLDIR!\%%~nxF" "!OLDINSTALLDIR!\%%~nxF" ) if NOT ["%%~nxF"] == ["staging.bat"] ( if NOT ["%%~nxF"] == ["staging.txt"] ( move "!STAGINGDIR!\%%~nxF" "!INSTALLDIR!\%%~nxF" ) ) ) : Finished del /q /f "!INSTALLDIR!\^! SRB2 INSTALL INSTRUCTIONS ^!.txt" set MSGEXE= if exist "!SystemRoot!\System32\msg.exe" ( set MSGEXE=!SystemRoot!\System32\msg.exe ) else ( if exist "!SystemRoot!\Sysnative\msg.exe" ( set MSGEXE=!SystemRoot!\Sysnative\msg.exe ) ) if ["!OLDINSTALLCHANGED!"] == ["1"] ( "!systemroot!\explorer.exe" /select, "!OLDINSTALLDIR!" echo Finished^^! Some of your old installation files were moved to the "old-install" folder. > !TEMP!\srb2msgprompt.txt echo. >> !TEMP!\srb2msgprompt.txt echo If you no longer need these files, you may delete the folder safely. >> !TEMP!\srb2msgprompt.txt echo. >> !TEMP!\srb2msgprompt.txt echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt !MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt del !TEMP!\srb2msgprompt.txt ) else ( if /I ["!USERDIR!"] == ["!INSTALLDIR!"] ( "!systemroot!\explorer.exe" "!INSTALLDIR!" echo Finished^^! > !TEMP!\srb2msgprompt.txt echo. >> !TEMP!\srb2msgprompt.txt echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt !MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt del !TEMP!\srb2msgprompt.txt ) else ( "!systemroot!\explorer.exe" "!USERDIR!" echo Finished^^! You may find your game data in this folder: > !TEMP!\srb2msgprompt.txt echo. >> !TEMP!\srb2msgprompt.txt echo !USERDIR! >> !TEMP!\srb2msgprompt.txt echo. >> !TEMP!\srb2msgprompt.txt echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt !MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt del !TEMP!\srb2msgprompt.txt ) ) : Attempt to remove OLDINSTALLDIR, in case it's empty rmdir /q "!OLDINSTALLDIR!" cd \ start "" /b "cmd" /s /c " del /f /q "%STAGINGDIR%\*"&rmdir /s /q "%STAGINGDIR%"&exit /b "