命令行输入和UseShellExecute == true

时间:2012-11-30 05:17:16

标签: c# command-line cmd

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

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

然后我需要将程序TYPE指定为cmd.exe中的特定字符串。住在我目前的工作目录中。我不能使用“UseShellExecute == false”,因为它会杀死shell,我需要shell才能工作。

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

3 个答案:

答案 0 :(得分: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以使这个工作正常 - 我忘了!

答案 1 :(得分: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。最后,请注意,如果输出超出缓冲区,重定向标准输出可能会导致应用程序挂起。如果您希望它不仅仅是一点点数据,那么您需要特别努力地阅读它。

答案 2 :(得分: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);