什么应该是 trival 的事情现在已经吞噬了我一小时的时间! > __<
我想以xml路径作为参数启动可执行文件。 (我已将此程序所在的目录添加到我的系统路径中。)看起来很简单。我的第一种方法是使用静态Process.Start()方法:
Process.Start(@"MyExecutable.exe", "C:\\My Doc\\SomeDirectory\\MyXMLPath.xml");
这个过程确实开始了,但是半秒后它就会死掉。所以,我喜欢 ooookaay ,也许可执行文件不喜欢我给它的论点?只是为了咯咯笑,我创建了一个可执行文件的快捷方式,并添加了xml文件路径作为其中一个参数。程序启动并按预期运行。不知道为什么会这样,我决定在命令行测试我的运气:
C:\MyExecutable.exe "C:\My Docs\SomeDirectory\MyXMLPath.xml"
从这种方式开始也没问题。
现在,此时我开始抓住吸管并决定创建Process类的实例:
Process proc = new Process(); proc.StartInfo.FileName = @"MyExecutable.exe"; proc.StartInfo.Arguments = "C:\\My Docs\\SomeDirectory\\MyXMLPath.xml"; proc.Start();
毋庸置疑,这根本没有帮助。 >。<
如此冷漠,我决定测试我的运气评论出一行:
//proc.StartInfo.Arguments = "C:\\My Docs\\SomeDirectory\\MyXMLPath.xml";
这个过程开始了。没有必要的论据,但它开始了。所以,问题是,当我尝试通过Process类启动它时,为什么程序不接受我给它的路径?如果只是在程序死亡时给我留言。 :(
有什么想法?非常感激!
答案 0 :(得分:4)
问题可能是因为文件路径中的空格。如果你考虑如何进行DOS调用,你必须在路径上加上引号。但你打电话给你的方式不是。因此,尝试在路径周围添加单引号。那应该照顾它。如果你从看起来如何呈现为命令行的角度考虑它,那么你需要做的更有意义。
Process proc = new Process();
proc.StartInfo.FileName = @"MyExecutable.exe";
proc.StartInfo.Arguments = "\"C:\\My Docs\\SomeDirectory\\MyXMLPath.xml\"";
proc.Start();
答案 1 :(得分:3)
您的参数包含空格:
proc.StartInfo.Arguments = "C:\\My Docs\\SomeDirectory\\MyXMLPath.xml";
这意味着您正在执行的程序正在接收以下内容作为其参数:
C:\My
Docs\SomeDirectory\MyXMLPath.xml
您需要做的是将其包装在 double 引号中(不是另一个答案中建议的单引号),因此:
proc.StartInfo.Arguments = "\"C:\\My Docs\\SomeDirectory\\MyXMLPath.xml\"";
这意味着您正在执行的程序现在只会收到一个参数:
"C:\My Docs\SomeDirectory\MyXMLPath.xml"
答案 2 :(得分:1)
您应该为流程的Exited
事件添加处理程序:
Process p = new Process();
p.Exited += new EventHandler(MyProcess_Exited);
然后检查处理程序中的ExitCode
:
private void MyProcess_Exited(object sender, EventArgs e)
{
Process p = sender as Process;
if (p.ExitCode == someValue)......
}
在没有任何其他信息的情况下,我会说启动过程的权限不足以读取或访问xml文件。