java - System.Diagnostics.Process 参数中路径中的空格问题

标签 java c# process cmd system.diagnostics

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

'C:\Program' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

显然这是因为名称中有空格,但我正确地引用了路径并使用转义字符来创建这些引号。这是用于运行 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 时,我得到上面列出的错误。有人能帮忙吗?这真的很烦人,我应该在几个小时前完成这个,但是当然是一个空间......一个单一的空间阻止我前进......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 为 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 ";

关于java - System.Diagnostics.Process 参数中路径中的空格问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32573473/

相关文章:

java - Python Selenium - 一个 session 浏览器

javascript - 在 Javascript 中将 Java 颜色转换为 RGB

c# - 具有混合类型的 TreeView HierarchicalDataTemplate

c# - 性能计数器类别名称? (C#)

java - 如何以无配置方式将可选任务 sshexec 加载到 Ant 中?

c# - asp.net 中的对象数据源

c# - 仅使用 C、指数和模数的 RSA 解密

linux进程本地存储

android - 你想终止进程 'app' - Android Studio

java - 对如何在java中使用交换器感到困惑