I've been searching for a script that would let me add text to the end of the current System variables Path. Is there any suggestions to how I could do that? (spesificly, adding ";C:\Program Files (x86)\Java\jre7\bin\java.exe" to the existing text)
echo Set objShell = CreateObject( "WScript.Shell" ) > %TEMP%\sp.vbs
echo Set objSystemEnv = objShell.Environment( "SYSTEM" ) >> %TEMP%\sp.vbs
echo objSystemEnv("Path") = objSystemEnv("Path") ^& ";C:\Program Files (x86)\Java\jre7\bin" >> %TEMP%\sp.vbs
cscript.exe /nologo %TEMP%\sp.vbs
del %TEMP%\sp.vbs
This CMD must run elevated, otherwise cscript.exe will just write "Permission denied" and nothing will happen.
IF you want the simplest solution you can use the SETX command in Windows 7:
SETX PATH "%PATH%;C:\New Added Folder"
PS1: Use the -M parameter if you want the SETX command to perform the changes on HKLM key.
PS2: The changes are PERMANENT but you need to restart user session or console.
If you want a a little thing more professional then you can use my utility PATHS wrote in Ruby, and i made an executable for Windows.
PATHS.EXE
http://exoshare.com/download.php?uid=1TKIOMR6



Options:
/? (or) -help | Show this info.
-l (or) -list | List the entries.
-c (or) -clean | Clean duplicates and invalid directories in the paths.
-r (or) -reset | Reset the paths to the Windows defaults.
-a (or) -add | Add a entry.
-d (or) -del | Delete a entry.
-add -current | Force adding a entry into the current user path.
-add -local | Force adding a entry into the local machine path.
Examples:
PATHS -l [+] Indexes all the entries.
PATHS -a "C:\Folder" [+] Adds a entry into the local path.
PATHS -a current "C:\Folder" [+] Adds a entry into the current user path.
PATHS -d "3" [+] Deletes the 3rd entry of the indexed list.
PATHS -d "C:\Folder" [+] Deletes a entry.
PATHS.RB
require 'win32/registry'
require 'rainbow'
# PATHS v0.1
#
# By Elektro H@cker
# Description:
# -----------
# This is a tool to manage the windows PATH enviroment.
exit if Object.const_defined?(:Ocra)
def logo()
  print "
   PATHS v0.1
   By Elektro H@cker
".foreground(:white)
end
def help()
  print '
   Options:
   /? (or) -help  | Show this info.
   -l (or) -list  | List the entries.
   -c (or) -clean | Clean duplicates and invalid directories in the paths.
   -r (or) -reset | Reset the paths to the Windows defaults.
   -a (or) -add   | Add a entry.
   -d (or) -del   | Delete a entry.
   -add -current  | Force adding a entry into the current user path.
   -add -local    | Force adding a entry into the local machine path.
   Examples:
   PATHS -l
   [+] Indexes all the entries.
   PATHS -a "C:\Folder"
   [+] Adds a entry into the local path.
   PATHS -a current "C:\Folder"
   [+] Adds a entry into the current user path.
   PATHS -d "3"
   [+] Deletes the 3rd entry of the indexed list.
   PATHS -d "C:\Folder"
   [+] Deletes a entry.
  '
  Process.exit
end
def error(kind)
  print "[+] ERROR"
  if kind == "pos"      then print "\n    Index #{ARGV[1]} is out of range, only #{$pos} entries.\n" end
  if kind == "notfound" then print "\n    Directory \"#{ARGV[1]}\" not found on PATH.\n" end
  Process.exit
end
def args()
  if ARGV.empty?                                   then get_paths("visible") end
  if ARGV[0] == "/?"    or ARGV[0] =~ /^-help$/i   then help()               end  
  if ARGV[0] =~ /^-l$/i or ARGV[0] =~ /^-list$/i   then get_paths("visible") end
  if ARGV[0] =~ /^-c$/i or ARGV[0] =~ /^-clean$/i  then clean_path()         end    
  if ARGV[0] =~ /^-d$/i or ARGV[0] =~ /^-del$/i    then del_path()           end
  if ARGV[0] =~ /^-a$/i or ARGV[0] =~ /^-add$/i    then add_path()           end
  if ARGV[0] =~ /^-r$/i or ARGV[0] =~ /^-reset$/i  then reset_path()         end
end
def get_paths(visibility)
  $pos = 0
  # HKCU path
  if not visibility == "hidden" then puts "\n   [+] Current User PATH:\n\n" end
  Win32::Registry::HKEY_CURRENT_USER.open('Environment') do |reg|
    for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
      $pos = $pos+1
      dir = dir.gsub(/^PATH=/, "")
      instance_variable_set "@_#{$pos}", dir + "?CURRENT_USER"
      if not File.directory? dir then invalid = "(Directory doesn't exist)".foreground(:red).bright else invalid ="" end
      if not visibility == "hidden"
        if $pos < 10 then puts "    #{$pos.to_s} = #{dir} #{invalid}" else puts "    #{$pos.to_s}= #{dir} #{invalid}"end
      end
    end
  end
  # HKLM path
  if not visibility == "hidden" then puts "\n\n   [+] Local Machine PATH:\n\n" end
  Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment') do |reg|
    for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
      $pos = $pos+1
      dir = dir.gsub(/^PATH=/, "")
      instance_variable_set "@_#{$pos}", dir + "?LOCAL_MACHINE"
      if not File.directory? dir then invalid = "(Directory doesn't exist)".foreground(:red).bright else invalid ="" end
      if not visibility == "hidden"
        if $pos < 10 then puts "    #{$pos.to_s} = #{dir} #{invalid}" else puts "    #{$pos.to_s}= #{dir} #{invalid}"end
      end
    end
  end
  if not visibility == "hidden" then Process.exit end
  $max_pos = $pos
end
def add_path()
  if ARGV[1] =~ /^-current$/ then key = "current" else key = "local" end
  # HKCU path
  if key == "current"
    Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
      value = reg['Path']
      reg.write('Path', Win32::Registry::REG_SZ, "#{value};#{ARGV.last}")
      puts "[+] Entry added in User PATH: #{ARGV.last}"
    end
  end
  # HKLM path
  if key == "local"
    Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
      value = reg['Path']
      reg.write('Path', Win32::Registry::REG_SZ, "#{value};#{ARGV.last}")
      puts "[+] Entry added in Local PATH: #{ARGV.last}"
    end
  end
end
def del_path()
    get_paths("hidden")
    final_path = ""
    found      = 0
    notfound   = 0
  if ARGV[1] =~ /^[1-9]+$/
    choose     = instance_variable_get "@_#{ARGV[1]}"
    if ARGV[1].to_i > $max_pos.to_i then error("pos") end
    # HKCU PATH index deletion
    if choose["?CURRENT_USER"]
      Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
        value = reg['Path']
        for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
          if not dir == choose.split("?").first then final_path << ";" + dir end
        end
        reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
      end
      puts "[+] Entry deleted in User PATH: #{choose.split("?").first}"
    end
    # HKLM PATH index deletion
    if choose["?LOCAL_MACHINE"]
      Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
        value = reg['Path']
        for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
          if not dir == choose.split("?").first then final_path << ";" + dir end
        end
        reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
      end
      puts "[+] Entry deleted in Local PATH: #{choose.split("?").first}"
    end
  elsif
    # HKCU PATH str deletion
      Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
        value = reg['Path']
        for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
          if not dir =~ /^#{Regexp.escape(ARGV[1])}$/i then final_path << ";" + dir else found = "yes" end
        end
        reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
        if found == "yes" then puts "[+] Entry deleted in User PATH: #{ARGV[1]}" else notfound = 1 end
      end
    # HKLM PATH str deletion
      final_path = ""
      found = ""
      Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
        value = reg['Path']
        for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
          if not dir =~ /^#{Regexp.escape(ARGV[1])}$/i then final_path << ";" + dir else found = "yes" end
        end
        reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
        if found == "yes" then puts "[+] Entry deleted in Local PATH: #{ARGV[1]}" else notfound = notfound+1 end
        if notfound == 2 then error("notfound") end
      end
    end
end
def reset_path()
  Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg| reg.write('Path', Win32::Registry::REG_SZ, 'C:\Windows;C:\Windows\system32;C:\Windows\System32\Wbem;C:\Windows\syswow64') end
  Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg| reg.write('Path', Win32::Registry::REG_SZ, 'C:\Windows;C:\Windows\system32;C:\Windows\System32\Wbem;C:\Windows\syswow64') end
  puts "[+] PATH restored to Windows defaults."
end
def clean_path()
  puts "\n[+] Searching invalid or duplicated entries in the PATH...\n\n"
  # HKCU PATH
  final_path = ""
  Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
    value = reg['Path']
    for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
      if File.directory? dir and not final_path[/#{Regexp.escape(dir)}$/i] then final_path << ";" + dir else puts "[+] Entry deleted in User PATH: #{dir}" end
    end
    reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
  end
  # HKLM PATH
  final_path = ""
  Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', Win32::Registry::KEY_ALL_ACCESS) do |reg|
    value = reg['Path']
    for dir in reg['Path', Win32::Registry::REG_SZ].split(";").sort do
      if File.directory? dir and not final_path[/#{Regexp.escape(dir)}$/i] then final_path << ";" + dir else puts "[+] Entry deleted in Local PATH: #{dir}" end
    end
    reg.write('Path', Win32::Registry::REG_SZ, final_path[1..-1])
  end
  puts "\n[+] PATH is cleaned.\n\n"
end
logo()
args()
Process.exit
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With