• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

执行cmd然后卡住了,怎么办呀?谢谢了,大家帮忙看下.

qcbf2 2012-01-05 07:15:23
如果执行cmd或者command这些命令然后就会在p.StandardOutput.ReadToEnd();这里卡住...
现在我解决的方法就是


public static string executeCmd(string command)
{
string strRst = "0";
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.AutoFlush = true;
p.StandardInput.WriteLine("@echo off");
p.StandardInput.WriteLine(command);
p.StandardInput.WriteLine("exit");

System.Timers.Timer timer = new System.Timers.Timer(3000);
timer.Start();
timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{

p.CloseMainWindow();
timer.Enabled = false;
timer.Close();
};

strRst = p.StandardOutput.ReadToEnd();
timer.Enabled = false;
timer.Close();
strRst = strRst.Substring(strRst.IndexOf(command) + command.Length);
strRst = strRst.Substring(0,strRst.Length - 8);
if (p.StandardError.ReadToEnd() != "")
{
strRst = p.StandardError.ReadToEnd();
}

p.WaitForExit();
p.Close();
return strRst;
}


这样加个时间,一旦3秒后强行结束,但是p.StartInfo.CreateNoWindow = true;就不管用了,
p.StartInfo.CreateNoWindow = false;就可以..
...全文
409 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qcbf2 2012-01-05
[Quote=引用 5 楼 fangxinggood 的回复:]

1.用异步IO流读取(注意不是将ReadToEnd移到线程里,而是用 BeginRead() 和 RecievedData 事件)

2.用 Process.WaitForExit(3000) 等待3秒,如果返回 false , Process.Kill
[/Quote]


..................

谢谢了.
回复
机器人 2012-01-05
1.用异步IO流读取(注意不是将ReadToEnd移到线程里,而是用 BeginRead() 和 RecievedData 事件)

2.用 Process.WaitForExit(3000) 等待3秒,如果返回 false , Process.Kill
回复
qcbf2 2012-01-05
[Quote=引用 3 楼 fangxinggood 的回复:]

正常啊,这属于同步的IO处理。ReadToEnd() 结束才会执行下一步。你可以用异步读取Cmd上的流的。
[/Quote]

但是,就算分到其他线程去了,他一直在那里阻塞着,这个线程也不会结束呀...

有什么办法强制结束 p.StandardOutput.ReadToEnd();这里呀?
回复
机器人 2012-01-05
正常啊,这属于同步的IO处理。ReadToEnd() 结束才会执行下一步。你可以用异步读取Cmd上的流的。
回复
qcbf2 2012-01-05
[Quote=引用 1 楼 startstartsvip 的回复:]
这个有问题吧? 你读了两遍

if (p.StandardError.ReadToEnd() != "")
{
strRst = p.StandardError.ReadToEnd();
}
[/Quote]

不是呀...这里是.

第一次,读取output的字符...
然后,会判断一下,是否有error的,如果有就读取error的,没有的话还是output的...


嗯,现在主要问题是执行cmd或者command这些cmd命令的话会卡住....
回复
startstartsvip 2012-01-05

这个有问题吧? 你读了两遍

if (p.StandardError.ReadToEnd() != "")
{
strRst = p.StandardError.ReadToEnd();
}
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2012-01-05 07:15
社区公告

让您成为最强悍的C#开发者