1

我有一个程序,基本上剩下的就是通过 CMD.exe 调用命令。

我需要在我当前的工作目录中打开 CMD.exe(我知道我可以做 Porcess.Start(CMD.exe))

然后我需要让程序在 cmd.exe 中键入一个特定的字符串。同时留在我当前的工作目录中。我不能使用“UseShellExecute == false”,因为它会杀死 shell,我需要 shell 才能工作。

显然我需要更具体。所以,我试图写入 cmd.exe 的文本是"clingo.exe \"Constants.txt\" \"Solver.txt\" \"Nodes.txt\" > \"Solved.txt\"". cligo.exe 是一个答案集编译器,我在常量、求解器和节点文件上使用它来获得通过管道传输到 Solved 的解决方案。所有这些文件都在一个目录中。

4

3 回答 3

4

首先,我对您认为UseShellExecute=false对您不起作用的原因感兴趣。有没有可能你没有正确使用它?

这是您最好的选择。这适用于 99% 的应用程序:

ProcessStartInfo psi = new ProcessStartInfo
{
    FileName = "clingo.exe",
    Arguments = "\"Constants.txt\" \"Solver.txt\" \"Nodes.txt\"",
    RedirectStandardOutput = true,
    UseShellExecute = false
};

using(Process p = Process.Start(psi))
using(Stream s = File.Create("Solved.txt"))
{
    p.StandardOutput.CopyTo(s);
    p.WaitForExit();
}

这是罕见的应用程序的一个选项,它不喜欢以标准方式传递的 args,但适用于 cmd.exe:

ProcessStartInfo psi = new ProcessStartInfo
{
    FileName = "cmd.exe",
    RedirectStandardInput = true,
    UseShellExecute = false // note this applies to cmd.exe specifically,
                            // NOT the processes that you start from cmd.exe
};

using(Process p = Process.Start(psi))
{
    p.StandardInput.WriteLine("clingo \"Constants.txt\" \"Solver.txt\" \"Nodes.txt\" > \"Solved.txt\"");
    p.StandardInput.WriteLine("exit");
    p.WaitForExit();
}

您可能还需要重定向 StandardOutput 和 StandardError 才能使这个工作正常——我忘了​​!

于 2012-11-30T05:37:51.867 回答
0

您可以尝试传递参数,但请确保您的 exe 参数正确

ProcessStartInfo proc = new ProcessStartInfo();
proc.FileName = @"C:\clingo.exe \Constants.txt\ \Solver.txt\ \Nodes.txt\ > \Solved.txt\";
proc.Arguments = @"10.2.2.125";
Process.Start(proc);
于 2012-11-30T05:29:42.933 回答
0

为什么需要从命令行启动进程?那这个呢?

var process = new Process { StartInfo = new ProcessStartInfo("cmd", "/c clingo.exe Constants.txt Solver.txt Nodes.txt") };
process.Start();
process.StartInfo.RedirectStandardOutput = true;
process.WaitForExit();
//do something with process.StandardOutput, this has the results

这里需要注意一些技巧。首先,使用 cmd 的 /c 参数,它会使提示立即退出。其次,根据您的上下文,您可能需要设置process.StartInfo.CreateNoWindow = true. 最后,请注意,如果输出超出缓冲区,重定向标准输出可能会导致应用程序挂起。如果您希望它不仅仅是一点点数据,您将需要特别努力将其读出。

于 2012-11-30T05:26:19.877 回答