System.Diagnostics.Process 参数中路径中的空格问题
Problems With Spaces In Path In System.Diagnostics.Process parameters
首先让我说这个问题不是 Use Process.Start with parameters AND spaces in path 的重复问题。我正在使用 System.Diagnostics.Process 启动 cmd.exe window,然后 运行ning java 在 window 中。除了我希望 java 命令是 运行 基于它们安装的 Java 路径,因为 PATH 环境变量不可靠并且在 [=34= 时似乎不经常设置] 已安装。所以我用实际的 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,它运行是java命令与PATH设置的命令。这对我来说很好,但对那些从未尝试过从命令行 运行 java 的人来说就不行了。但是当我检查 chbPath 时,我得到上面列出的错误。有人能帮忙吗?这真的很烦人,我应该在几个小时前就完成了,但是当然 SPACE.....一个 SPACE 阻止我前进....ARGHHH!!!
编辑:
这里还有我的路径查找器的代码,我在这里使用了另一个 post:
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 ";
好的,所以我能够修复它。显然我不需要 运行 cmd window 到 运行 java 命令,因为使用 diagnostics.process 以这种方式启动程序总是会创建一个控制台window。所以我只是将 GetJavaInstallationPath() 代码更改为 return 实际 java 可执行文件的路径,然后设置 StartInfo.FileName = GetJavaInstallationPath();
这几乎解决了我所有的问题。这样工作目录就保留在游戏目录中,我仍然可以获得我想要的控制台 window。所以我想我太努力了。 :) 这是固定代码:
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();
}
首先让我说这个问题不是 Use Process.Start with parameters AND spaces in path 的重复问题。我正在使用 System.Diagnostics.Process 启动 cmd.exe window,然后 运行ning java 在 window 中。除了我希望 java 命令是 运行 基于它们安装的 Java 路径,因为 PATH 环境变量不可靠并且在 [=34= 时似乎不经常设置] 已安装。所以我用实际的 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,它运行是java命令与PATH设置的命令。这对我来说很好,但对那些从未尝试过从命令行 运行 java 的人来说就不行了。但是当我检查 chbPath 时,我得到上面列出的错误。有人能帮忙吗?这真的很烦人,我应该在几个小时前就完成了,但是当然 SPACE.....一个 SPACE 阻止我前进....ARGHHH!!!
编辑:
这里还有我的路径查找器的代码,我在这里使用了另一个 post:
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 ";
好的,所以我能够修复它。显然我不需要 运行 cmd window 到 运行 java 命令,因为使用 diagnostics.process 以这种方式启动程序总是会创建一个控制台window。所以我只是将 GetJavaInstallationPath() 代码更改为 return 实际 java 可执行文件的路径,然后设置 StartInfo.FileName = GetJavaInstallationPath();
这几乎解决了我所有的问题。这样工作目录就保留在游戏目录中,我仍然可以获得我想要的控制台 window。所以我想我太努力了。 :) 这是固定代码:
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();
}