title: Installing Java with silent install into a directory with spaces
body: <p>I am trying to install Java using the silent mode and also specify an installation directory that contains spaces.  When I do this it pops up the "Windows Installer" dialog box indicating one of the parameters is incorrect.  If I use the short path name it works correctly, but I really would prefer not to use the short directory name because that is the value that gets stored in the Registry.</p>
  
  <p>The command I want to use...</p>
  
  <pre><code>jre-6u39-windows-i586.exe /s INSTALLDIR="C:\Program Files (x86)\Java"
  </code></pre>
  
  <p>This pops up the Windows Installer dialog box.</p>
  
  <p>When I use...</p>
  
  <pre><code>jre-6u39-windows-i586.exe /s INSTALLDIR=C:\Progra~2\Java
  </code></pre>
  
  <p>This works.</p>
  
  <p>NOTE: "Program Files (x86)" is just an example.  This is installed at client sites and they choose the install directory, therefore we have to be able to support any directory they may specify.</p>
  
  <p>Any idea how I can do a silent install but still use the long path name?</p>
  
  <p><em><strong>UPDATE:</em></strong></p>
  
  <p>I thought I would share the final solution.  One cool thing I found that I wanted to share is that you can suppress the auto-reboot of install and it returns an exit code of 3010.  Therefore you can defer the reboot to another time.  Here is the code (rewritten a bit to eliminate a bunch of our own abstraction)</p>
  
  <pre><code>public bool InstallJava(string installPath, string logFile)
  {
      bool rebootRequired = false;
  
      string fullLogFileName = Path.Combine(logFile, "JavaInstall.log");
      string arguments = string.Format("/s /v\"/qn REBOOT=Suppress INSTALLDIR=\\\"{0}\\\" STATIC=1 /L \\\"{1}\\\"\"", installPath, fullLogFileName);
  
      ProcessStartInfo startInfo = new ProcessStartInfo { RedirectStandardError = true, RedirectStandardOutput = true, RedirectStandardInput = true, UseShellExecute = false, CreateNoWindow = true, 
      FileName = "jre-7u25-windows-x64.exe",  Arguments = arguments };
  
      var process = Process.Start(startInfo);
      process.WaitForExit();
  
      if (process.ExitCode == 3010)
          rebootRequired = true;
  
      else if (process.ExitCode != 0)
      {
          // This just looks through the list of error codes and returns the appropriate message
          string expandedMessage = ExpandExitCode(StringResources.JAVA_INSTALL_ERROR, process.ExitCode, fullLogFileName);
          throw new Exception(expandedMessage);
      }
  
      return rebootRequired;
  }
  </code></pre>