
c#执行dos命令 问题
publicstaticstringCmd(string[]cmd){Processprocess=newProcess();process.StartInfo.File...
public static string Cmd(string[] cmd)
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.StandardInput.AutoFlush = true;
for (int i = 0; i < cmd.Length; i++)
{
process.StandardInput.WriteLine(cmd[i].ToString());
}
process.StandardInput.WriteLine("exit");
string strRst = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
return strRst;
}
我执行dos命令安装软件, dos命令执行完之后 软件还在安装 这是怎么回事。还有怎么验证执行dos命令安装软件成功或者失败。
除了用dos命令安装软件之外c#还有什么方法可以执行安装软件 在线等 展开
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.StandardInput.AutoFlush = true;
for (int i = 0; i < cmd.Length; i++)
{
process.StandardInput.WriteLine(cmd[i].ToString());
}
process.StandardInput.WriteLine("exit");
string strRst = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
return strRst;
}
我执行dos命令安装软件, dos命令执行完之后 软件还在安装 这是怎么回事。还有怎么验证执行dos命令安装软件成功或者失败。
除了用dos命令安装软件之外c#还有什么方法可以执行安装软件 在线等 展开
2个回答
展开全部
原因是出现了死锁。由于标准输出流被重定向,而Process.StandardOutput的缓冲大小是有限制的(据说是4k),所以当缓冲满了的时候(执行上面的批处理文件有很多的输出),子进程(cmd.exe)会等待主进程(C# App)读取并释放此缓冲,而主进程由于调用了WaitForExit()方法,则会等待子进程退出,最后形成死锁。
解决办法:
1)修改C#代码,将p.StartInfo.RedirectStandardOutput = true;
改成false,这样所有的输出会在命令行屏幕上直接输出,不会重定向到标准输出流中。
2)修改C#代码,在p.WaitForExit(6000);前添加p.BeginOutputReadLine();或 p.StandardOutput.ReadToEnd();,通过读取输出流,以便释放相应的缓冲。
解决办法:
1)修改C#代码,将p.StartInfo.RedirectStandardOutput = true;
改成false,这样所有的输出会在命令行屏幕上直接输出,不会重定向到标准输出流中。
2)修改C#代码,在p.WaitForExit(6000);前添加p.BeginOutputReadLine();或 p.StandardOutput.ReadToEnd();,通过读取输出流,以便释放相应的缓冲。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询