在带有空格的目录中使用静默安装安装Java

6
我正在尝试使用静默模式安装Java,并指定一个包含空格的安装目录。当我这样做时,它会弹出“Windows Installer”对话框,指示其中一个参数不正确。如果我使用短路径名,则可以正常工作,但我真的不想使用短目录名称,因为该值将存储在注册表中。
我想要使用的命令...
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)”只是一个例子。 这个软件安装在客户端,他们可以选择安装目录,因此我们必须能够支持他们指定的任何目录。

您有什么想法如何进行静默安装但仍然使用长路径名?

更新:

我想分享最终解决方案。 我发现的一个很酷的东西要分享的是,您可以禁止自动重新启动安装,并返回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;
}

1
你尝试过 %ProgramFiles% 吗? - vqdave
对于我的表述不够清晰我感到抱歉。"Program Files (x86)" 只是一个示例。我已经修改了问题以正确反映这一点。 - Gene S
1个回答

5

2
我每隔一周就会问自己,微软的一个混蛋为什么要这样愚蠢地给一个经常使用的目录命名为“Program Files(x86)”。 - Ingo
1
@Ingo 相比于 cmd.exe 的“令人惊叹”的 shell 语法和统一的引号/参数处理以及用于调用程序的整个子系统,这几乎不是一个问题。 - user166390
我同意 @pst 的观点:主要问题在于 cmd.exe 的命令行处理方式基本上是愚蠢的。 - Adrian Pronk
1
@pst 正确。 微软几十年来一直表现得不在乎那些试图从命令行使用他们的操作系统的人们。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接