输出运行命令提示符

时间:2012-10-10 03:42:22

标签: c#

在下面的代码中,每当我发送任何命令如dir或任何东西时,此函数都会陷入while循环。 我希望每次发送命令时执行命令提示输出,而不执行命令后关闭进程。

public void shell(String cmd)
{
        ProcessStartInfo PSI = new ProcessStartInfo();
        PSI.FileName = "c:\\windows\\system32\\cmd.exe";
        PSI.RedirectStandardInput = true;
        PSI.RedirectStandardOutput = true;
        PSI.RedirectStandardError = true;
        PSI.UseShellExecute = false;
        Process p = Process.Start(PSI);
        StreamWriter CSW = p.StandardInput;
        StreamReader CSR = p.StandardOutput;
        CSW.WriteLine(cmd);
        CSW.Flush();
        while(!(CSR.EndOfStream))
        {
            Console.WriteLine(CSR.ReadLine());
        }

        CSR.Close();

}

以下是完整的代码: -

 namespace ConsoleApplication8
 {

     class Program
     {
         public static void shell(String cmd)
         {

             ProcessStartInfo PSI = new ProcessStartInfo();
             PSI.FileName = "c:\\windows\\system32\\cmd.exe";
             PSI.RedirectStandardInput = true;
             PSI.RedirectStandardOutput = true;
             PSI.RedirectStandardError = true;
             PSI.UseShellExecute = false;
             Process p = Process.Start(PSI);
             StreamWriter CSW = p.StandardInput;
             StreamReader CSR = p.StandardOutput;
             CSW.WriteLine(cmd);
             CSW.Flush();
             while (!(CSR.EndOfStream))
             {
                 Console.WriteLine(CSR.ReadLine());
             }

             CSR.Close();

         }
         static void Main(string[] args)
         {
             string cmd="";
             while (cmd != "exit")
             {
            cmd=Console.ReadLine();
            shell(cmd);
             }
         }
     }
 }

目的 - >我想创建一个程序,让用户可以执行命令提示符的命令。上面的程序每次发送一些命令时都会创建cmd.exe进程。但这不是一个大问题。我可以很容易地解决这个问题。主要的问题是,每次发送命令时程序都会被卡住(!(CSR.EndOfStream))

2 个答案:

答案 0 :(得分:1)

您可以尝试使用此代码

         ProcessStartInfo PSI = new ProcessStartInfo();
         PSI.FileName = "c:\\windows\\system32\\cmd.exe";
         //PSI.RedirectStandardInput = true;
         PSI.RedirectStandardOutput = true;
         PSI.RedirectStandardError = true;
         PSI.UseShellExecute = false;
         Process p = Process.Start(PSI);
         StreamWriter CSW = p.StandardInput;

         string output = p.StandardOutput.ReadToEnd(); 

         Console.WriteLine(output);

答案 1 :(得分:0)

当直接写入输入流时,我能够复制cmd.exe挂起的问题。当您运行这样的程序时,.NET无法判断输出流何时完成,因此当您调用ReadToEnd()时(或者如果您使用一段时间直到流结束),它将无限期挂起。最好的办法是做一些这样的事情,你可以用一个作为参数提供的命令启动cmd.exe。然后它会知道在完成执行命令后关闭输出流,将控制权返回给调用者。

这是一个例子。

static void Main()
{
    while (true)
    {
        Console.Write("> ");
        string input = Console.ReadLine();
        string output = RunCommand(input);
        Console.WriteLine(output);
    }
}

static string RunCommand(string command)
{
    Process p = Process.Start(new ProcessStartInfo()  {
        FileName = "cmd",
        Arguments = "/c \"" + command + "\"",
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        UseShellExecute = false
    });

    string output = p.StandardOutput.ReadToEnd();
    string error = p.StandardError.ReadToEnd();
    p.WaitForExit();
    return output + error;
}

以下是这将产生的输出示例

> echo hello, world
hello, world

> ping google.com

Pinging google.com [74.125.225.199] with 32 bytes of data:
Reply from 74.125.225.199: bytes=32 time=63ms TTL=49
Reply from 74.125.225.199: bytes=32 time=61ms TTL=49
Reply from 74.125.225.199: bytes=32 time=61ms TTL=49
Reply from 74.125.225.199: bytes=32 time=61ms TTL=49

Ping statistics for 74.125.225.199:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 61ms, Maximum = 63ms, Average = 61ms

>