| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | @ECHO OFF & SETLOCAL EnableDelayedExpansionTITLE ghacks user.js updaterREM ## ghacks-user.js updater for WindowsREM ## author: @claustromaniacREM ## version: 4.6REM ## instructions: https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.3-Updater-ScriptsSET v=4.7VERIFY ONCD /D "%~dp0"SET _myname=%~n0SET _myparams=%*:parseIF "%~1"=="" (GOTO endparse)IF /I "%~1"=="-unattended" (SET _ua=1)IF /I "%~1"=="-log" (SET _log=1)IF /I "%~1"=="-logp" (SET _log=1 & SET _logp=1)IF /I "%~1"=="-multioverrides" (SET _multi=1)IF /I "%~1"=="-merge" (SET _merge=1)IF /I "%~1"=="-updatebatch" (SET _updateb=1)IF /I "%~1"=="-singlebackup" (SET _singlebackup=1)SHIFTGOTO parse:endparseIF DEFINED _updateb (	REM The normal flow here goes from phase 1 to phase 2 and then phase 3.	IF NOT "!_myname:~0,9!"=="[updated]" (		IF EXIST "[updated]!_myname!.bat" (			REM ## Phase 3 ##: The new script, with the original name, will:			REM 	* Delete the [updated]*.bat and *.bat.old scripts			REM 	* Begin the normal routine			FC "[updated]!_myname!.bat" "!_myname!.bat.old" >nul			IF NOT "!errorlevel!"=="0" (				CALL :message "Script updated to version !v!"				TIMEOUT 3 >nul			)			REN "[updated]!_myname!.bat" "[updated]!_myname!.bat.old"			DEL /F "!_myname!.bat.old" "[updated]!_myname!.bat.old"			GOTO begin		)		REM ## Phase 1 ##		REM 	* Download new batch and name it [updated]*.bat		REM 	* Start that script in a new CMD window		REM 	* Exit		CALL :message "Updating script..."		REM Uncomment the next line and comment out the PowerShell call for testing.		REM COPY /B /Y "!_myname!.bat" "[updated]!_myname!.bat" >nul		(			PowerShell -Command "(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.bat', '[updated]!_myname!.bat')"		) >nul 2>&1		IF EXIST "[updated]!_myname!.bat" (			START /min CMD /C "[updated]!_myname!.bat" !_myparams!		) ELSE (			CALL :message "Failed. Make sure PowerShell is allowed internet access."			TIMEOUT 120 >nul		)	) ELSE (		IF "!_myname!"=="[updated]" (			CALL :message "The [updated] label is reserved. Rename this script and try again."			TIMEOUT 300 >nul		) ELSE (			REM ## Phase 2 ##: The [updated]*.bat script will:			REM 	* Rename the old script and make a copy of itself with the original name.			REM 	* Run that copy in a new CMD instance			REM 	* Exit			IF EXIST "!_myname:~9!.bat" ( REN "!_myname:~9!.bat" "!_myname:~9!.bat.old" )			COPY /B /Y "!_myname!.bat" "!_myname:~9!.bat"			START CMD /C "!_myname:~9!.bat" !_myparams!		)	)	EXIT /B):beginCLSECHO:ECHO:ECHO:                ########################################ECHO:                ####  user.js Updater for Windows   ####ECHO:                ####       by claustromaniac        ####ECHO:                ####             v!v!               ####ECHO:                ########################################ECHO:SET /A "_line=0"IF NOT EXIST user.js (	CALL :message "user.js not detected in the current directory.") ELSE (	FOR /F "skip=1 tokens=1,* delims=:" %%G IN (user.js) DO (		SET /A "_line+=1"		IF !_line! GEQ 4 (GOTO exitloop)		IF !_line! EQU 1 (SET _name=%%H)		IF !_line! EQU 2 (SET _date=%%H)		IF !_line! EQU 3 (SET _version=%%G)	)	:exitloop	IF NOT "!_name!"=="" (		IF /I NOT "!_name!"=="!_name:ghacks=!" (			CALL :message "!_name! !_version:~2!,!_date!"		) ELSE (CALL :message "Current user.js version not recognised.")	) ELSE (CALL :message "Current user.js version not recognised."))ECHO:IF NOT DEFINED _ua (	CALL :message "This batch should be run from your Firefox profile directory."	ECHO:  It will download the latest version of ghacks user.js from github and then	CALL :message "append any of your own changes from user-overrides.js to it."	CALL :message "Visit the wiki for more detailed information."	ECHO:	TIMEOUT 1 /nobreak >nul	CHOICE /C SHE /N /M "Start [S] Help [H] Exit [E]"	CLS	IF ERRORLEVEL 3 (EXIT /B)	IF ERRORLEVEL 2 (GOTO :showhelp))IF DEFINED _log (	CALL :log >>user.js-update-log.txt 2>&1	IF DEFINED _logp (START user.js-update-log.txt)	EXIT /B	:log	SET _log=2	ECHO:##################################################################	ECHO:  %date%, %time%)IF EXIST user.js.new (DEL /F "user.js.new")CALL :message "Retrieving latest user.js file from github repository..."(	PowerShell -Command "(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js', 'user.js.new')") >nul 2>&1IF EXIST user.js.new (	IF DEFINED _multi (		FORFILES /P user.js-overrides /M *.js >nul 2>&1		IF NOT ERRORLEVEL 1 (			IF DEFINED _merge (				CALL :message "Merging..."				COPY /B /Y user.js-overrides\*.js user-overrides-merged.js				CALL :merge user-overrides-merged.js				COPY /B /Y user.js.new+user-overrides-merged.js user.js.new				CALL :merge user.js.new			) ELSE (				CALL :message "Appending..."				COPY /B /Y user.js.new+"user.js-overrides\*.js" user.js.new			)		) ELSE (CALL :message "No override files found.")	) ELSE (		IF EXIST "user-overrides.js" (			COPY /B /Y user.js.new+"user-overrides.js" "user.js.new"			IF DEFINED _merge (				CALL :message "Merging user-overrides.js..."				CALL :merge user.js.new			) ELSE (				CALL :message "user-overrides.js appended."			)		) ELSE (CALL :message "user-overrides.js not found.")	)	IF EXIST user.js (		FC user.js.new user.js >nul && SET "_changed=false" || SET "_changed=true"	)	IF "!_changed!"=="true" (		CALL :message "Backing up..."		IF DEFINED _singlebackup (			MOVE /Y user.js user.js.bak >nul		) ELSE (			SET "_time=!time: =0!"			MOVE /Y user.js "user-backup-!date:/=-!_!_time::=.!.js" >nul		)		REN user.js.new user.js		CALL :message "Update complete."	) ELSE (		IF "!_changed!"=="false" (			DEL /F user.js.new >nul			CALL :message "Update completed without changes."		) ELSE (			REN user.js.new user.js			CALL :message "Update complete."			SET "_changed=true"		)	)) ELSE (	CALL :message "Update failed. Make sure PowerShell is allowed internet access."	ECHO:  No changes were made.)IF NOT DEFINED _log (	IF NOT DEFINED _ua (		IF EXIST prefsCleaner.bat (			IF "!_changed!"=="true" (				CALL :message "Would you like to run the prefsCleaner now?"				CHOICE /C YN /N /M "(Y/N) "				IF "1"=="!errorlevel!" ( START "" cmd.exe /C "prefsCleaner.bat" )			) ELSE (PAUSE)		) ELSE (PAUSE)	))EXIT /BREM ########### Message Function ###########:messageSETLOCAL DisableDelayedExpansionIF NOT "2"=="%_log%" (ECHO:)ECHO:  %~1IF NOT "2"=="%_log%" (ECHO:)ENDLOCALGOTO :EOFREM ############ Merge function ############:mergeSETLOCAL DisableDelayedExpansionFOR /F tokens^=2^,^*^ delims^=^'^" %%G IN ('FINDSTR /R /C:"^user_pref[ 	]*\([ 	]*[\"'].*[\"'][ 	]*,.*\)[ 	]*;" "%~1"') DO (SET "[%%G]=%%H")FOR /F tokens^=2^,^*^ delims^=^' %%G IN ('FINDSTR /R /C:"^//// --- comment-out --- '[^'][^']*'.*" "%~1"') DO (SET "__unset__%%G=1")(	FOR /F "tokens=1,* delims=:" %%I IN ('FINDSTR /N "^" "%~1"') DO (		SET "_temp=%%J"		SETLOCAL EnableDelayedExpansion		IF NOT "!_temp:~0,9!"=="user_pref" (			ENDLOCAL & ECHO:%%J		) ELSE (			IF "!_temp:;=!"=="!_temp!" (				ENDLOCAL & ECHO:%%J			) ELSE (				ENDLOCAL				FOR /F tokens^=2^ delims^=^'^" %%K IN ("%%J") DO (					IF NOT "_user.js.parrot"=="%%K" (						IF DEFINED __unset__%%K (							ECHO://%%J						) ELSE (							IF DEFINED [%%K] (								SETLOCAL EnableDelayedExpansion								FOR /F "delims=" %%L IN ("![%%K]!") DO (									ENDLOCAL & ECHO:user_pref("%%K"%%L									SET "[%%K]="								)							)						)					) ELSE (ECHO:%%J)				)			)		)	))>updatertempfileMOVE /Y updatertempfile "%~1" >nulENDLOCALGOTO :EOFREM ############### Help ##################:showhelpMODE 80,46CLSCALL :message "Available arguments (case-insensitive):"CALL :message "  -log"ECHO:     Write the console output to a logfile (user.js-update-log.txt)CALL :message "  -logP"ECHO:     Like -log, but also open the logfile after updating.CALL :message "  -merge"ECHO:     Merge overrides instead of appending them. Single-line comments andECHO:     _user.js.parrot lines are appended normally. Overrides for inactiveECHO:     user.js prefs will be appended. When -Merge and -MultiOverrides are usedECHO:     together, a user-overrides-merged.js file is also generated in the rootECHO:     directory for quick reference. It contains only the merged data fromECHO:     override files and can be safely discarded after updating, or used as theECHO:     new user-overrides.js. When there are conflicting records for the sameECHO:     pref, the value of the last one declared will be used. Visit the wikiECHO:     for usage examples and more detailed information.CALL :message "  -multiOverrides"ECHO:     Use any and all .js files in a user.js-overrides sub-folder as overridesECHO:     instead of the default user-overrides.js file. Files are appended inECHO:     alphabetical order.CALL :message "  -unattended"ECHO:     Run without user input.CALL :message "  -singleBackup"ECHO:     Use a single backup file and overwrite it on new updates, instead ofECHO:     cumulative backups. This was the default behaviour before v4.3.CALL :message "  -updatebatch"ECHO:     Update the script itself on execution, before the normal routine.CALL :message ""PAUSEMODE 80,25GOTO :begin
 |