【问题标题】:Problems With Spaces In Path In System.Diagnostics.Process parametersSystem.Diagnostics.Process 参数中路径中的空格问题
【发布时间】:2015-12-10 23:12:00
【问题描述】:

首先让我说这个问题不是Use Process.Start with parameters AND spaces in path的重复。我正在使用 System.Diagnostics.Process 启动 cmd.exe 窗口,然后在该窗口中运行 java。除了我希望根据他们安装的 Java 路径运行 java 命令,因为 PATH 环境变量是不可靠的,并且在安装 Java 时似乎并不经常设置。所以我用实际的 Java 路径替换了我的 Process 参数中的“java”,但现在我收到了这个错误:

'C:\Program' is not recognized as an internal or external command, operable program or batch file.

显然这是因为名称中有空格,但我正确引用了路径并使用转义字符来创建这些引号。以下是用于运行 cmd.exe 的代码:

        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
        startInfo.FileName = "cmd.exe";
        if (chbPath.Checked) startInfo.Arguments = "/C \"" + javaPath + "\\bin\\java.exe\" -Djava.library.path=\"lib\\natives-win\" -jar SecondDimension.jar " + chbWindowed.Checked.ToString();
        else startInfo.Arguments = "/C java -Djava.library.path=\"lib\\natives-win\" -jar SecondDimension.jar " + chbWindowed.Checked.ToString();
        process.StartInfo = startInfo;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.Start();
        this.Visible = false;
        process.WaitForExit();
        Console.WriteLine(process.StandardError.ReadToEnd());
        Application.Exit();

如果 chbPath.Checked = false,它将运行带有 PATH 设置的 java 命令的命令。这对我来说很好,但对那些从未尝试过从命令行运行 java 的人来说就不行了。但是当我检查 chbPath 时,我得到了上面列出的错误。有人能帮忙吗?这真的很烦人,我应该在几个小时前就完成了,但当然是一个 SPACE....一个 SINGLE SPACE 正在阻止我前进....ARGHHH !!!

编辑:

这也是我的路径查找器的代码,我在此处发布了另一篇文章:

        String javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
        using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(javaKey))
        {
            String currentVersion = baseKey.GetValue("CurrentVersion").ToString();
            using (var homeKey = baseKey.OpenSubKey(currentVersion))
                return homeKey.GetValue("JavaHome").ToString();
        }

【问题讨论】:

  • 您是否尝试使用 ProcessStartInfo 类的 WorkingDirectory 属性?
  • 我没有。所以你是说设置process.StartInfo.WorkingDirectory = javaPath 然后运行java 命令?
  • 好的,谢谢,我会试试的。
  • 阅读MSDN page,了解该属性及其与 UseShellExecute 的交互
  • 好的,我试了一下,虽然它现在可以正确找到 java 可执行文件,但它无法再找到我尝试运行的 .jar,因为它位于运行程序的目录中,这与 Java 目录不同。 -.-

标签: java c# process cmd system.diagnostics


【解决方案1】:

首先您可以使用属性ProcessStartInfo.WorkingDirectory 设置Java 进程的工作文件夹,然后,由于您的程序位于不同的目录中,您需要更改该程序的路径。

您可以设置一个环境变量并使用该变量来完成程序的路径或直接在环境变量中包含程序的名称

Environment.SetEnvironmentVariable("JAVA_PRG", @"d:\temp"); // Whatever
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = Path.Combine(javaPath, "bin");
startInfo.FileName = "cmd.exe";
if (chbPath.Checked) 
    startInfo.Arguments = "/C java.exe .... -jar %JAVA_PRG%\SecondDimension.jar ";

【讨论】:

  • 啊,太好了,这几乎比我修复它的方法还要好。谢谢史蒂夫!
【解决方案2】:

好的,所以我能够修复它。显然我不需要运行 cmd 窗口来运行 java 命令,因为使用 diagnostics.process 以这种方式启动程序总是会创建一个控制台窗口。所以我只是更改了 GetJavaInstallationPath() 代码以返回实际 java 可执行文件的路径,然后只设置 StartInfo.FileName = GetJavaInstallationPath(); 这几乎解决了我所有的问题。这样,工作目录保留在游戏目录中,我仍然得到我想要的控制台窗口。所以我想我太努力了。 :) 这是固定代码:

    private void btnLaunch_Click(object sender, EventArgs e)
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.FileName = GetJavaInstallationPath();
        startInfo.Arguments = "-Djava.library.path=\"lib\\natives-win\" -jar SecondDimension.jar " + chbWindowed.Checked.ToString();
        process.StartInfo = startInfo;
        process.Start();
        this.Visible = false;
        process.WaitForExit();
        Application.Exit();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多