# # # Simple editor for fixing paths on Windows # package require Tk package require tile package require registry ############################################################################## namespace eval ::pathedit { variable list variable pathlist } proc ::pathedit::updateList { } { variable list variable pathlist $list delete 0 end foreach path $pathlist { $list insert end $path } } proc ::pathedit::read { } { variable list variable pathlist puts "pathedit::read" set regPath {HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment} set curPath [registry get $regPath "Path"] set pathlist [ split $curPath ";" ] ::pathedit::updateList } proc ::pathedit::save { } { variable pathlist puts "::pathedit::save" set newPath "" foreach path $pathlist { append newPath "$path;" } puts $newPath set regPath {HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment} registry set $regPath "Path" "$newPath" registry broadcast "Environment" } proc ::pathedit::moveup { } { variable list variable pathlist set selIndex [ $list curselection ] if { ( [ string length $selIndex ] > 0 ) && ( $selIndex > 0 ) } { set swapIndex [ expr { $selIndex - 1 } ] set select [ lindex $pathlist $selIndex ] set swap [ lindex $pathlist $swapIndex ] lset pathlist $swapIndex $select lset pathlist $selIndex $swap ::pathedit::updateList $list selection set $swapIndex $list see $swapIndex } } proc ::pathedit::movedown { } { variable list variable pathlist set selIndex [ $list curselection ] set lastIndex [ $list index end ] if { ( [ string length $selIndex ] > 0 ) && ( $selIndex < ( $lastIndex - 1) ) } { set swapIndex [ expr { $selIndex + 1 } ] set select [ lindex $pathlist $selIndex ] set swap [ lindex $pathlist $swapIndex ] lset pathlist $swapIndex $select lset pathlist $selIndex $swap ::pathedit::updateList $list selection set $swapIndex $list see $swapIndex } } proc ::pathedit::add { } { variable pathlist variable list set file [ tk_chooseDirectory -mustexist true ] if { $file ne "" } { set selIndex [ $list curselection ] if { $selIndex eq "" } { set selIndex 0 } set pathlist [ linsert $pathlist $selIndex [ file native $file ] ] ::pathedit::updateList } } proc ::pathedit::remove { } { variable pathlist variable list set selIndex [ $list curselection ] if { $selIndex ne "" } { set pathlist [ lreplace $pathlist $selIndex $selIndex ] ::pathedit::updateList } } proc ::pathedit::makeGui { } { variable list frame .f frame .b frame .r ttk::button .b.exit -text "Exit" -command exit ttk::button .b.read -text "Re-read" -command ::pathedit::read ttk::button .b.save -text "Save" -command ::pathedit::save ttk::button .r.up -text "Move Up" -command ::pathedit::moveup ttk::button .r.down -text "Move Down" -command ::pathedit::movedown ttk::button .r.add -text "Add path" -command ::pathedit::add ttk::button .r.remove -text "Remove Path" -command ::pathedit::remove set list [ listbox .f.list -yscrollcommand { .f.scroll set } ] ttk::scrollbar .f.scroll -command { .f.list yview } pack .r -side right -fill y pack .b -side bottom -fill x pack .f -side left -fill both -expand true pack .f.list -side left -fill both -expand true pack .f.scroll -side right -fill y pack .b.save .b.read .b.exit -side left pack .r.up .r.down .r.add .r.remove -side top } # For Debugging bind . <Alt-c> { console show } ######################################################3 pathedit::makeGui pathedit::read
MEd 2006/03/01: A nice script, but unfortunately I get an error dialog when I try to save: "unable to open key: access is denied" (Win XP, Service Pack 1). I guess this is because you try change the system variable "path" and I do not have administrator rights. Actually there are two path variables on the system, one user variable and one system variable, as normal user I'm only allowed to change the user variable. The real path (when you type "echo %PATH%" on cmd.exe) consists of user variable + system variable. By the way: the "user variable" can also be found in the registry:
HKEY_CURRENT_USER\Environment\path
MG adds, on a side note, that the "built-in" way to edit the path (and other environment variables) on his Win XP SP2 machine seems to be to right-click on "My Computer" -> Properties -> Advanced -> Environment Variables. Strangely, running
parray envfrom the wish console lists many vars for me which don't appear in that Windows list...MEd I guess thats the point I mentioned above (that there are two path variables, one in the system and one in the user "variable space"
AEC The values seen by
parray envare also visible by executing
setat the prompt in the window's command shell.
PSW The whole point for me is to be able to MOVE things so I can force the programs I want higher in the path. I just played around with the script and changed the path's to point to the "user" path, the script still seems to work the same. But perhaps that will fix other peoples permission issues.
Here is a little utility to clean up the Windows PATH: remove non-existing directories, trailing backslashes, duplicates. It only returns the cleaned string, and it is up to the caller to actually set it. RS 2012-08-17
proc clean_path {} { set res {} foreach part [split $::env(PATH) ";"] { set part [string trimright $part \\] if ![file exists $part] continue if {[lsearch -exact $res $part] >= 0} continue lappend res $part } join $res ";" }