Jump to content


Photo

Append to %PATH%


  • Please log in to reply
4 replies to this topic

#1 Uncle_Gadget

Uncle_Gadget

    Advanced Member

  • Members
  • PipPipPip
  • 66 posts
  • Location:U.S.A. - Georgia
  • OS:Windows 7 x64

Posted 01 July 2012 - 03:23 AM

Once again I'm stuck on an inf problem. Does anyone know of a way to append to the %PATH% using an INF installer?

I know that the path is stored in the registry at:
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path"

And I know it would be easy to replace the path. The question is can I append to the existing path in the registry?

And, then, to really complicate matters... Would there be a way to uninstall the appended path portion ONLY on an uninstall? I'm probably asking for too much, now. :albert:

Edited by Uncle_Gadget, 01 July 2012 - 03:28 AM.


#2 ricktendo

ricktendo

    Group: Banned

  • Global Mods
  • 7,765 posts
  • Location:La Ceiba
  • OS:Windows 8 x64

Posted 01 July 2012 - 03:43 AM

Ive struggled with this too, I can get append (0x10008) to add but never could figure out the uninstall
  • Uncle_Gadget likes this

#3 Uncle_Gadget

Uncle_Gadget

    Advanced Member

  • Members
  • PipPipPip
  • 66 posts
  • Location:U.S.A. - Georgia
  • OS:Windows 7 x64

Posted 01 July 2012 - 09:49 PM

Ive struggled with this too, I can get append (0x10008) to add but never could figure out the uninstall

Thanks. Even this helps. I'll probably write a simple AutoIt executable and execute it during RunPostSetupCommands=

#4 Uncle_Gadget

Uncle_Gadget

    Advanced Member

  • Members
  • PipPipPip
  • 66 posts
  • Location:U.S.A. - Georgia
  • OS:Windows 7 x64

Posted 01 July 2012 - 10:02 PM

I was doing a bit more research and found the Registry Data Types below. Is there a difference between NOCLOBBER and APPEND?

; REG_MULTI_SZ_APPEND = 0x0001000A
; REG_MULTI_SZ_NOCLOBBER = 0x00010002


I know it doesn't help me with a REG_EXPAND_SZ, but wouldn't the line below work as an uninstall data type for REG_MULTI_SZ?

; REG_MULTI_SZ_DELVAL = 0x00010006


#5 Uncle_Gadget

Uncle_Gadget

    Advanced Member

  • Members
  • PipPipPip
  • 66 posts
  • Location:U.S.A. - Georgia
  • OS:Windows 7 x64

Posted 06 July 2012 - 02:13 AM

If anyone's interested, I wrote a fairly sophisticated AutoIt script to add/remove to/from %PATH% using the registry.

If you run it silently, it will generate an ERRORLEVEL if it encounters any errors while executing. Feel free to use or modify as needed.

#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=C:\Users\Public\Desktop\Uninstall.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Description=Append or Remove elements from %PATH%
#AutoIt3Wrapper_Res_Fileversion=1.0.0.16
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#AutoIt3Wrapper_Res_Field=ProductName|PATH Appender-Remover
#AutoIt3Wrapper_Res_Field=ProductVersion|1.0
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Tidy=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.8.1
Author:		 Uncle Gadget
Script Function:
This script will appends or remove elements from the %PATH% Environment
#ce ----------------------------------------------------------------------------
Local $Silent, $NewRegPath

Global $CommandError = "Uninstall.exe <a/r/as/rs> <path to append/remove>" & @LF & @LF & _
		"	a = Append to existing %PATH%" & @LF & _
		"	r = Remove from existing %PATH%" & @LF & @LF & _
		"	as = Append (silently) to existing %PATH%" & @LF & _
		"	rs = Remove (silently) from existing %PATH%"


If $CmdLine[0] <> 2 Then; not enough Command Line parameters were entered
	MsgBox(262160, "Command Line Error (1)", "Uninstall.exe expects parameters to be as follows:" & @LF & @LF & _
			$CommandError)
	Exit 1
EndIf

Global $Path = StringStripWS($CmdLine[2], 3) ; Strip all White Space from Begin and End of Command Line (2)

Global $Command = StringLower(StringStripWS($CmdLine[1], 3))

Local $RegPath = RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path")

Switch $Command
	Case "as" ; (a)ppend / (s)ilent
		$Silent = 1 ; Turns on the Silent (No Output) Flag to eliminate any user output
		ContinueCase ; Continue on to Append below


	Case "a" ; (a)ppend
		Opt("ExpandEnvStrings", 1) ; Turns ON Expanded Environment Strings
		If Not FileExists($Path) Then ; the requested Path to Append/Remove does not exist - ERROR
			If Not $Silent Then ; we'll let User know about error if 's'ilent was NOT specified
				MsgBox(262160, "Path Does Not Exist (2)", "The Path to append (below) does not currently exist." & @LF & @LF & _
						$Path & @LF & @LF & _
						"Verify that Path exists prior to execution.")
			EndIf
			Exit 1
		EndIf

		$LowerPath = StringLower($Path)
		$LowerRegPath = StringLower($RegPath)
		$ExpPathLen = StringLen(";" & $Path)
		Opt("ExpandEnvStrings", 0) ; Turns OFF Expanded Environment Strings

		If $LowerPath & ";" = StringLeft($LowerRegPath, $ExpPathLen) Or StringInStr($LowerRegPath, ";" & $LowerPath & ";") Or ";" & $LowerPath = StringRight($LowerRegPath, $ExpPathLen) Then ; the path to remove is currently somewhere in %PATH%
			If Not $Silent Then ; we'll let User know that Path to Append currently exists in %PATH%
				MsgBox(262208, "Path Currently Exists (3)", "The Path to append (below) is currently specified in %PATH%." & @LF & @LF & _
						$Path & @LF & @LF & _
						"No changes will be made to the %PATH%.")
			EndIf
			Exit 0 ; Although no changes were necessary we'll exit with no error since our mission WAS accomplished
		EndIf

		$AppendWrite = RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path", "REG_EXPAND_SZ", $RegPath & ";" & $Path)
		If Not $AppendWrite Then ; some sort of error occurred while writing
			If Not $Silent Then ; we'll let User know about error if 's'ilent was NOT specified
				MsgBox(262160, "Registry Write Error (4)", "Unable to write appended %PATH% to the registry." & @LF & @LF & _
						"Error Code Returned was: " & @error & @LF & @LF & _
						"Review command line options before trying again.")
			EndIf
			Exit 1
		EndIf

		If Not $Silent Then ; we'll let the User know that all changes have been made as requested.
			MsgBox(262208, "Path Successfully Appended", "The path (below) was successfully appended to %PATH%." & @LF & @LF & _
					$Path)
		EndIf

		EnvUpdate()

		Exit 0


	Case "rs" ; ®emove / (s)ilent
		$Silent = 1 ; Turns on the Silent (No Output) Flag to eliminate any user output
		ContinueCase ; Continue on to Remove below


	Case "r" ; ®emove
		$PathLen = StringLen(";" & $Path)

		If $Path & ";" = StringLeft($RegPath, $PathLen) Then ; the path to remove is at the BEGINNING of %PATH%
			$NewRegPath = StringTrimLeft($RegPath, $PathLen) ; and we'll create the new %PATH% String by Trimming of the beginning of %PATH%

		ElseIf StringInStr($RegPath, ";" & $Path & ";") Then ; the path to remove is in the MIDDLE of %PATH%
			$NewRegPath = StringReplace($RegPath, ";" & $Path & ";", ";") ; and we'll create the new %PATH% String

		ElseIf ";" & $Path = StringRight($RegPath, $PathLen) Then ; the path to remove is at END of %PATH%
			$NewRegPath = StringTrimRight($RegPath, $PathLen) ; and we'll create the new %PATH% String by trimming off the end of %PATH%

		Else ; the path to remove is NOT in current %PATH% and we can't make any changes
			If Not $Silent Then ; we'll let User know about error if 's'ilent was NOT specified
				MsgBox(262160, "Path Removal Error(5)", "The Path specified for removal (below) does not exist in current %PATH%." & @LF & @LF & _
						$Path & @LF & @LF & _
						"Review command line options before trying again.")
			EndIf
			Exit 1
		EndIf

		$RemoveWrite = RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path", "REG_EXPAND_SZ", $NewRegPath)

		If Not $RemoveWrite Then ; some sort of error occurred while writing
			If Not $Silent Then ; we'll let User know about error if 's'ilent was NOT specified
				MsgBox(262160, "Registry Write Error (6)", "Unable to write removed %PATH% to the registry." & @LF & @LF & _
						"Error Code Returned was: " & @error & @LF & @LF & _
						"Review command line options before trying again.")
			EndIf
			Exit 1
		EndIf

		If Not $Silent Then ; we'll let the User know that all changes have been made as requested.
			MsgBox(262208, "Path Successfully Removed", "The path (below) was successfully removed from %PATH%." & @LF & @LF & _
					$Path)
		EndIf

		EnvUpdate()

		Exit 0

	Case Else ; an invalid parameter was entered
		MsgBox(262160, "Invalid Command option (7)", "Uninstall expects parameters to be as follows:" & @LF & @LF & _
				$CommandError)
		Exit 1
EndSwitch

Attached Files


Edited by Uncle_Gadget, 06 July 2012 - 04:03 AM.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users