mirror of
				https://github.com/therootcompany/pathman.git
				synced 2024-11-16 17:09:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # winpath
 | |
| 
 | |
| An example of getting, setting, and broadcasting PATHs on Windows.
 | |
| 
 | |
| This requires the `unsafe` package to use a syscall with special message poitners to update `PATH` without a reboot.
 | |
| It will also build without `unsafe`.
 | |
| 
 | |
| ```bash
 | |
| go build -tags unsafe -o winpath.exe
 | |
| ```
 | |
| 
 | |
| ```bash
 | |
| winpath show
 | |
| 
 | |
|         %USERPROFILE%\AppData\Local\Microsoft\WindowsApps
 | |
|         C:\Users\me\AppData\Local\Programs\Microsoft VS Code\bin
 | |
|         %USERPROFILE%\go\bin
 | |
|         C:\Users\me\AppData\Roaming\npm
 | |
|         C:\Users\me\AppData\Local\Keybase\
 | |
| ```
 | |
| 
 | |
| ```bash
 | |
| winpath append C:\someplace\special
 | |
| 
 | |
| 	Run the following for changes to take affect immediately:
 | |
| 	PATH %PATH%;C:\someplace\special
 | |
| ```
 | |
| 
 | |
| ```bash
 | |
| winpath prepend C:\someplace\special
 | |
| 
 | |
| 	Run the following for changes to take affect immediately:
 | |
| 	PATH C:\someplace\special;%PATH%
 | |
| ```
 | |
| 
 | |
| ```bash
 | |
| winpath remove C:\someplace\special
 | |
| ```
 | |
| 
 | |
| # Special Considerations
 | |
| 
 | |
| Giving away the secret sauce right here:
 | |
| 
 | |
| * `HWND_BROADCAST`
 | |
| * `WM_SETTINGCHANGE`
 | |
| 
 | |
| This is essentially the snippet you need to have the HKCU and HKLM Environment registry keys propagated without rebooting:
 | |
| 
 | |
| ```go
 | |
| 	HWND_BROADCAST   := uintptr(0xffff)
 | |
| 	WM_SETTINGCHANGE := uintptr(0x001A)
 | |
| 	_, _, err := syscall.
 | |
| 		NewLazyDLL("user32.dll").
 | |
| 		NewProc("SendMessageW").
 | |
| 		Call(HWND_BROADCAST, WM_SETTINGCHANGE, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("ENVIRONMENT"))))
 | |
| 
 | |
| ```
 | |
| 
 | |
| * `os.Getenv("COMSPEC")`
 | |
| * `os.Getenv("SHELL")`
 | |
| 
 | |
| If you check `SHELL` and it isn't empty, then you're probably in MINGW or some such.
 | |
| If that's empty but `COMSPEC` isn't, you can be reasonably sure that you're in cmd.exe or Powershell.
 |