c#中怎样确认cmd中输入的一行命令执行完毕
我用cmd命令格式化一个移动磁盘,省略前面的设置,输入命令行为:p.StandardInput.WriteLine("formatk:/fs:fat");//写入命令p....
我用cmd命令格式化一个移动磁盘,
省略前面的设置,输入命令行为:
p.StandardInput.WriteLine("format k: /fs:fat"); //写入命令
p.StandardInput.WriteLine(""); //输入回车符
p.StandardInput.WriteLine("Memery"); //输入磁盘标志
p.StandardInput.WriteLine("exit"); //结束cmd进程
string ss = p.StandardOutput.ReadToEnd();
其中p为进程,程序只执行了前面三行就死掉不动了,也就是那行exit命令根本没有执行,设置断点发现其实exit往进程p里写了,但是cmd根本没有执行这行,输出文件里也看不到这行的写入,感觉就像是exit写入太早,cmd没有反应过来,因为我在输入exit行设置断点,等待大概10秒钟,后继续运行,exit行能被执行,能成功关闭p进程。
程序死掉后,我查看了我要格式化的那个磁盘其实已经格式化了
请问,有什么方法让我获取格式化动作完成,让程序等待格式化完成后再写入exit行
尝试了你的方法,显示流不支持查找,请问还有别的方法吗,是不是sw.BaseStream.Length不是这种用法?? 展开
省略前面的设置,输入命令行为:
p.StandardInput.WriteLine("format k: /fs:fat"); //写入命令
p.StandardInput.WriteLine(""); //输入回车符
p.StandardInput.WriteLine("Memery"); //输入磁盘标志
p.StandardInput.WriteLine("exit"); //结束cmd进程
string ss = p.StandardOutput.ReadToEnd();
其中p为进程,程序只执行了前面三行就死掉不动了,也就是那行exit命令根本没有执行,设置断点发现其实exit往进程p里写了,但是cmd根本没有执行这行,输出文件里也看不到这行的写入,感觉就像是exit写入太早,cmd没有反应过来,因为我在输入exit行设置断点,等待大概10秒钟,后继续运行,exit行能被执行,能成功关闭p进程。
程序死掉后,我查看了我要格式化的那个磁盘其实已经格式化了
请问,有什么方法让我获取格式化动作完成,让程序等待格式化完成后再写入exit行
尝试了你的方法,显示流不支持查找,请问还有别的方法吗,是不是sw.BaseStream.Length不是这种用法?? 展开
展开全部
试下用这个函数,p为进程对象,cmd为需要写入的命令,我估计如果命令处理完,后台会把流里面的数据截走,这样长度就会为0,如果不为0代表还未执行结束,我只是这样估计的,不确定能否成功
public void WriteLine(Process p, String cmd)
{
StreamWriter sw = p.StandardInput;
while(sw.BaseStream.Length>0);
sw.WriteLine(cmd);
sw.Flush();
}
public void WriteLine(Process p, String cmd)
{
StreamWriter sw = p.StandardInput;
while(sw.BaseStream.Length>0);
sw.WriteLine(cmd);
sw.Flush();
}
展开全部
调用cmd命令的代码
#region 停止录象-压缩成flv
private void Stop_Click(object sender, EventArgs e)
{
this.ChangeView();
Close();
}
/// <summary>
/// 压缩成flv
/// </summary>
private void ChangeView()
{
stnameflv = stname + ".flv";
string str = @""+fileName+" "+stnameflv+"";
//string str = @"f:\test.avi f:\test_allen.flv";
RunFFMpeg(str);
}
//运行FFMpeg的视频解码,
public void RunFFMpeg(string strCmd)
{
//创建并启动一个新进程
Process p = new Process();
//设置进程启动信息属性StartInfo,这是ProcessStartInfo类,包括了一些属性和方法:
p.StartInfo.FileName = @"F:\ffmpeg.exe"; //程序名
p.StartInfo.Arguments = " -i " + strCmd; //执行参数
p.Start();
}
//运行Cmd.exe执行Dos 命令,并返回执行结果
public string RunCmd(string command)
{
//创建并启动一个对进程
Process p = new Process();
//Process类有一个StartInfo属性,这是ProcessStartInfo类,包括了一些属性和方法,例如:
p.StartInfo.FileName = "cmd.exe"; //程序名
p.StartInfo.Arguments = " /c " + command; //执行参数
p.StartInfo.UseShellExecute = false; //关闭Shell的使用
p.StartInfo.RedirectStandardInput = true; //重定向标准输入
p.StartInfo.RedirectStandardOutput = true; //重定向标准输出
p.StartInfo.RedirectStandardError = true; //重定向错误输出
p.StartInfo.CreateNoWindow = true; //设置不显示窗口
p.Start();
//p.StandardInput.WriteLine(command); //也可以用这种方式输入要执行的命令
//p.StandardInput.WriteLine("exit"); //不过要记得加上Exit要不然下一行程式执行的时候会当机
//必须创建可以自动转换完成以后,结束进程的代码
return p.StandardOutput.ReadToEnd(); //从输出流取得命令执行结果
}
#region 停止录象-压缩成flv
private void Stop_Click(object sender, EventArgs e)
{
this.ChangeView();
Close();
}
/// <summary>
/// 压缩成flv
/// </summary>
private void ChangeView()
{
stnameflv = stname + ".flv";
string str = @""+fileName+" "+stnameflv+"";
//string str = @"f:\test.avi f:\test_allen.flv";
RunFFMpeg(str);
}
//运行FFMpeg的视频解码,
public void RunFFMpeg(string strCmd)
{
//创建并启动一个新进程
Process p = new Process();
//设置进程启动信息属性StartInfo,这是ProcessStartInfo类,包括了一些属性和方法:
p.StartInfo.FileName = @"F:\ffmpeg.exe"; //程序名
p.StartInfo.Arguments = " -i " + strCmd; //执行参数
p.Start();
}
//运行Cmd.exe执行Dos 命令,并返回执行结果
public string RunCmd(string command)
{
//创建并启动一个对进程
Process p = new Process();
//Process类有一个StartInfo属性,这是ProcessStartInfo类,包括了一些属性和方法,例如:
p.StartInfo.FileName = "cmd.exe"; //程序名
p.StartInfo.Arguments = " /c " + command; //执行参数
p.StartInfo.UseShellExecute = false; //关闭Shell的使用
p.StartInfo.RedirectStandardInput = true; //重定向标准输入
p.StartInfo.RedirectStandardOutput = true; //重定向标准输出
p.StartInfo.RedirectStandardError = true; //重定向错误输出
p.StartInfo.CreateNoWindow = true; //设置不显示窗口
p.Start();
//p.StandardInput.WriteLine(command); //也可以用这种方式输入要执行的命令
//p.StandardInput.WriteLine("exit"); //不过要记得加上Exit要不然下一行程式执行的时候会当机
//必须创建可以自动转换完成以后,结束进程的代码
return p.StandardOutput.ReadToEnd(); //从输出流取得命令执行结果
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询