サイレント モードを使用して Java をインストールしようとしていますが、スペースを含むインストール ディレクトリも指定しています。これを行うと、パラメータの 1 つが正しくないことを示す [Windows インストーラ] ダイアログ ボックスがポップアップ表示されます。短いパス名を使用すると正しく機能しますが、レジストリに格納される値であるため、短いディレクトリ名を使用したくないのです。
使いたいコマンド...
jre-6u39-windows-i586.exe /s INSTALLDIR="C:\Program Files (x86)\Java"
これにより、Windows インストーラ ダイアログ ボックスが表示されます。
使うと...
jre-6u39-windows-i586.exe /s INSTALLDIR=C:\Progra~2\Java
これは機能します。
注: 「Program Files (x86)」は単なる例です。これはクライアント サイトでインストールされ、クライアント サイトがインストール ディレクトリを選択するため、クライアントが指定する任意のディレクトリをサポートできる必要があります。
サイレント インストールを実行しながら、長いパス名を使用する方法を教えてください。
アップデート:
最終的な解決策を共有すると思いました。私が共有したいと思った素晴らしい点の 1 つは、インストールの自動再起動を抑制できることです。これにより、終了コード 3010 が返されます。したがって、再起動を別の時間に延期できます。これがコードです(独自の抽象化の束を排除するために少し書き直しました)
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;
}