在下面的代码中,每当我发送任何命令如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))
答案 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
>