使用System.Diagnostics.Process.Start()启动程序时遇到问题

时间:2010-08-11 21:28:07

标签: c# .net

什么应该是 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类启动它时,为什么程序不接受我给它的路径?如果只是在程序死亡时给我留言。 :(

有什么想法?非常感激!

3 个答案:

答案 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文件。