6

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)

1
  • 1
    You can do this, but it will only last until your batch file finishes. If you're looking to make it a permanent change, it won't work. Commented Nov 27, 2012 at 22:33

2 Answers 2

4
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.

Sign up to request clarification or add additional context in comments.

7 Comments

That's not a batch file. It's a batch file creating a scripting file and then launching it. While it will work, it's not actually an answer to the question asked, any more than using a batch file to write a c# source file, run the compiler, and then launch the executable would be.
@KenWhite, it is a batch file, and it gets the job done. C# source doesn't: 1. Its much harder to do from a batch file 2. On pre-Vista, you generally don't have csc.exe for that.
You missed my point. The question is specifically tagged windows batch, and your answer does not use a Windows batch file to modify the PATH. It uses the batch file to write and execute a different type of script, just as I said above. That's not an answer to the question asked. You said "use VBScript, but add the overhead of writing the script file from a batch file instead of in NotePad." (I didn't downvote your answer, BTW. Just pointing out it doesn't address the question asked.)
@KenWhite, IMO when people ask questions like "I need a script that.." they're rarely doing an academic research on the capabilities of various scripting environments. Instead, they usually need the script to accomplish something.
@KenWhite, why you keep saying it's impossible in pure CMD? You can use "reg query" command to read "Path" value in "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" key, then "for /F" to extract the data you need, then "setx /M" to update the variable. It's however much more complex and error prone than the solution I've proposed.
|
0

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

enter image description here

enter image description here

enter image description here

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.