strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
while (p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
p.WaitForExit();
36 个解决方案
#1
Boolean bNext = false;
while (!p.HasExited)
{
bNext = p.HasExited;
if (bNext)
break;
}
试一下
#2
不行,p.HasExited 一直是false
有没有什么办法可以判断DOS命令有没有成功执行,如果成功了就退出,不成功抛出错误原因,我现在发现CMD执行DOS命令即便不成功也不会抛出异常,直接就正常退出函数了,没有跑到catch中
有没有什么办法可以判断DOS命令有没有成功执行,如果成功了就退出,不成功抛出错误原因,我现在发现CMD执行DOS命令即便不成功也不会抛出异常,直接就正常退出函数了,没有跑到catch中
#3
mark 回复内容太短了!
#4
你在读到的strOutput中查找 DOS命令成功执行后的所含有的字符串就可以了啊,如果没有查找到就是执行失败了啊,你还可以读StandardError,查看读到的内容确定失败的原因.
#5
使用日志记录操作结果
#6
最简单的方法:
在DOS命令后面加一句输出.
例如: C:\>echo o >d:\特定的文件名
然后再程式中循环判断(Sleep(10)) d:\下是否有该特定文件名.
有,就表示执行完毕将其删除然后进行下面的语句
,没有,就继续循环.
在DOS命令后面加一句输出.
例如: C:\>echo o >d:\特定的文件名
然后再程式中循环判断(Sleep(10)) d:\下是否有该特定文件名.
有,就表示执行完毕将其删除然后进行下面的语句
,没有,就继续循环.
#7
p.ExitCode可以判断~
#8
现在已经确定格式化软盘成功,但是执行p.WaitForExit();的时候程序就死在那边了,其实格式化工作已经完成了,这个是为什么?
#9
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process p;
p.EnableRaisingEvents = true;
p.Exited+=new EventHandler(p_Exited);
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
while (p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
}
void p_Exited(Object sender,EventArgs e)
{
Console.WriteLine("finish");
}
}
}
触发Exited事件时就是格式化已经完成了.
#10
while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
你要想知道是否执行成功,可以做成这样效果,用一个RichTextBox接收执行提示:
相关程序如下:
private void BeginClearSystembtn_Click(object sender, EventArgs e)
{
this.ViewInfoRTB.Text = "";
Process p = new Process();
p.StartInfo.FileName = "format "+p_strDriverName+" /FS:FAT /Q";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.Start();
StreamReader reader = p.StandardOutput;
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
this.ViewInfoRTB.AppendText(line + " ");
this.ViewInfoRTB.AppendText("\n");
line = reader.ReadLine();
}
p.WaitForExit();
p.Close();
reader.Close();
}
#11
学习下!!!!!!!!!呵呵 我也想知道
#12
HELLOWORDC 说的对,while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
我现在改完之后,
while (!p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
当循环到p.StandardOutput.ReadLine()的内容为正在初始化文件分配表后面一个循环程序就死在那边了,也不会往下面走了,前面加了p.Exited+=new EventHandler(p_Exited);也没有跳到结束处理函数中,但是当我点VS2005结束按钮终止程序运行后,软驱等才亮,其实已经格式化完毕。
但是中间如果发生错误了,怎么能抛出错误呢?还有现在看似是不能正常结束。strOutput 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数
我现在改完之后,
while (!p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
当循环到p.StandardOutput.ReadLine()的内容为正在初始化文件分配表后面一个循环程序就死在那边了,也不会往下面走了,前面加了p.Exited+=new EventHandler(p_Exited);也没有跳到结束处理函数中,但是当我点VS2005结束按钮终止程序运行后,软驱等才亮,其实已经格式化完毕。
但是中间如果发生错误了,怎么能抛出错误呢?还有现在看似是不能正常结束。strOutput 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数
#13
我晓得了,正在初始化文件分配表 后面是提示是否输入卷盘,回车后还会提示是否格式化下一张盘,都要用户按回车的,是不是这个地方死在那边了?我前面已经写了exit了啊
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
#14
我已搞定上面的问题,多添加两个p.StandardInput.WriteLine("exit");就可以循环下去了,但是strOutput到了是否要格式化下一张软盘后exit,再下一个循环strOutput是空,再下一个循环依然死在那边,无法正常往下执行
#15
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Process p = new Process();
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived+=new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived+=new DataReceivedEventHandler(p_ErrorDataReceived);
p.StartInfo.FileName = "ipconfig.exe";
p.StartInfo.Arguments = " /all";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.StartInfo.UseShellExecute = false;
p.Start();
//开始异步读取输出
p.BeginOutputReadLine();
//调用WaitForExit会等待Exited事件完成后再继续往下执行。
p.WaitForExit();
Console.WriteLine("exit");
}
void p_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里是正常的输出
Console.WriteLine(e.Data);
}
void p_ErrorDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里得到的是错误信息
Console.WriteLine(e.Data);
}
void p_Exited(Object sender, EventArgs e)
{
Console.WriteLine("finish");
}
}
}
#16
是不是p.StandardInput.WriteLine("exit");代表一个回车啊,我刚才最后一个提示是是否格式化下一张软盘,应该是p.StandardInput.WriteLine("N");p.StandardInput.WriteLine("exit");两句,是不是这样啊?我这么试了还是不行,奇怪了
我用了xingyuebuyu的方法做了异步操作,在读取数据的时候还是会死在那个提示后面,我在DOS界面下看到下一个应该没有内容了。
string strOutput;
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("N");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.BeginOutputReadLine();
p.WaitForExit();
}
p.Close();
我用了xingyuebuyu的方法做了异步操作,在读取数据的时候还是会死在那个提示后面,我在DOS界面下看到下一个应该没有内容了。
string strOutput;
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("N");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.BeginOutputReadLine();
p.WaitForExit();
}
p.Close();
#17
建议你把“格式化软盘”的命令写在批处理里,直接调用批处理文件,然后按照我的方法用RichTextBox接收执行提示信息,也许情况不一样。
#18
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.StartInfo.UseShellExecute = false;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.Start();
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
//开始异步读取输出
p.BeginOutputReadLine();
p.BeginErrorReadLine();
//调用WaitForExit会等待Exited事件完成后再继续往下执行。
p.WaitForExit();
p.Close();
Console.WriteLine("exit");
}
void p_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里是正常的输出
Console.WriteLine(e.Data);
}
void p_ErrorDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里得到的是错误信息
Console.WriteLine(e.Data);
}
void p_Exited(Object sender, EventArgs e)
{
Console.WriteLine("finish");
}
}
}
此代码格式化G盘,测试OK,会触发Exited事件,楼上的说调用批处理文件应该也是可以的。
#19
xingyuebuyu:我用你的方法试了,用控制台应用程序来试验,结果应该和我的测试一样,那个DOS窗口开起来了,也看到程序执行完成,但是怎么让那个DOS窗口自动关闭呢,这个应该就是我在WINFORM里遇到的问题了,程序死在那边应该也是类似这个DOS窗口一直没有自动关闭
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件
#20
我在电脑上试过了格式化U盘,你全部用我的代码再试试,用winform的来试,控制台应用程序我倒没试过,现在是直接调用 format.com,而不是调用cmd.exe再执行格式化的.
#21
xingyuebuyu:我刚才试了用你的这两句确实可以正常到退出函数中
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
但是用p.StartInfo.FileName = "cmd.exe";
string strOutput;
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("N");
这样就不会正常执行到退出函数中
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
但是用p.StartInfo.FileName = "cmd.exe";
string strOutput;
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("N");
这样就不会正常执行到退出函数中
#22
最开始我也是这样的发现不能退出才改成用format.com的,至于为什么用 cmd.exe不能退出我也不知道具体的原因,所以你如果要通用的话还是要调用批处理文件,不过你这个的批处理文件我不会写,问其它人吧
#23
现在实验下来只能使用批处理的方式试试了,使用format.com,杀毒软件会自动禁止用户使用此命令,每台客户机都要去设置杀毒软件丢这个命令的权限,但是他可以通过异步的方式跟踪到错误和退出时的处理。
用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇
用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇
#24
DOS命令的没弄过。不知道怎么判断了
#25
在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。
#26
推荐
#27
学习一下,两下,三下!!!!!
#28
我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。
#29
学习一下,两下,三下!!!!!
#30
uP;
也谢谢这位,我之前也碰到这种问题,虽然从网上找了个办法解决了,但是一直不理解;
看了你的代码,基本弄清楚了
#31
学习一下,两下,三下!!!!!
#32
如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~
#33
这个批处理文件爱你怎么写啊?因为fomat的时候有很多提示,是否要怎样怎样,都要输入回车或者N的,怎么在批处理文件里写,执行就不会出现这些提示了?
#34
批处理文件中不知道如何使这些提示不出现
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...
是否要快速格式化另一张磁盘(Y/N)?
这两句不晓得怎么去掉提示
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...
是否要快速格式化另一张磁盘(Y/N)?
这两句不晓得怎么去掉提示
#35
搞定了,就用批处理的方式吧,下面这样就完全不会提示了,DOS语法太不熟悉
@echo off
echo y|format A: /FS:FAT /V: /Q
@echo off
echo y|format A: /FS:FAT /V: /Q
#36
晕了,没有看晕呀
#1
Boolean bNext = false;
while (!p.HasExited)
{
bNext = p.HasExited;
if (bNext)
break;
}
试一下
#2
不行,p.HasExited 一直是false
有没有什么办法可以判断DOS命令有没有成功执行,如果成功了就退出,不成功抛出错误原因,我现在发现CMD执行DOS命令即便不成功也不会抛出异常,直接就正常退出函数了,没有跑到catch中
有没有什么办法可以判断DOS命令有没有成功执行,如果成功了就退出,不成功抛出错误原因,我现在发现CMD执行DOS命令即便不成功也不会抛出异常,直接就正常退出函数了,没有跑到catch中
#3
mark 回复内容太短了!
#4
你在读到的strOutput中查找 DOS命令成功执行后的所含有的字符串就可以了啊,如果没有查找到就是执行失败了啊,你还可以读StandardError,查看读到的内容确定失败的原因.
#5
使用日志记录操作结果
#6
最简单的方法:
在DOS命令后面加一句输出.
例如: C:\>echo o >d:\特定的文件名
然后再程式中循环判断(Sleep(10)) d:\下是否有该特定文件名.
有,就表示执行完毕将其删除然后进行下面的语句
,没有,就继续循环.
在DOS命令后面加一句输出.
例如: C:\>echo o >d:\特定的文件名
然后再程式中循环判断(Sleep(10)) d:\下是否有该特定文件名.
有,就表示执行完毕将其删除然后进行下面的语句
,没有,就继续循环.
#7
p.ExitCode可以判断~
#8
现在已经确定格式化软盘成功,但是执行p.WaitForExit();的时候程序就死在那边了,其实格式化工作已经完成了,这个是为什么?
#9
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process p;
p.EnableRaisingEvents = true;
p.Exited+=new EventHandler(p_Exited);
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
while (p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
}
void p_Exited(Object sender,EventArgs e)
{
Console.WriteLine("finish");
}
}
}
触发Exited事件时就是格式化已经完成了.
#10
while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
你要想知道是否执行成功,可以做成这样效果,用一个RichTextBox接收执行提示:
相关程序如下:
private void BeginClearSystembtn_Click(object sender, EventArgs e)
{
this.ViewInfoRTB.Text = "";
Process p = new Process();
p.StartInfo.FileName = "format "+p_strDriverName+" /FS:FAT /Q";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.Start();
StreamReader reader = p.StandardOutput;
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
this.ViewInfoRTB.AppendText(line + " ");
this.ViewInfoRTB.AppendText("\n");
line = reader.ReadLine();
}
p.WaitForExit();
p.Close();
reader.Close();
}
#11
学习下!!!!!!!!!呵呵 我也想知道
#12
HELLOWORDC 说的对,while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
我现在改完之后,
while (!p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
当循环到p.StandardOutput.ReadLine()的内容为正在初始化文件分配表后面一个循环程序就死在那边了,也不会往下面走了,前面加了p.Exited+=new EventHandler(p_Exited);也没有跳到结束处理函数中,但是当我点VS2005结束按钮终止程序运行后,软驱等才亮,其实已经格式化完毕。
但是中间如果发生错误了,怎么能抛出错误呢?还有现在看似是不能正常结束。strOutput 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数
我现在改完之后,
while (!p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
Console.WriteLine(strOutput);
}
当循环到p.StandardOutput.ReadLine()的内容为正在初始化文件分配表后面一个循环程序就死在那边了,也不会往下面走了,前面加了p.Exited+=new EventHandler(p_Exited);也没有跳到结束处理函数中,但是当我点VS2005结束按钮终止程序运行后,软驱等才亮,其实已经格式化完毕。
但是中间如果发生错误了,怎么能抛出错误呢?还有现在看似是不能正常结束。strOutput 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数
#13
我晓得了,正在初始化文件分配表 后面是提示是否输入卷盘,回车后还会提示是否格式化下一张盘,都要用户按回车的,是不是这个地方死在那边了?我前面已经写了exit了啊
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
#14
我已搞定上面的问题,多添加两个p.StandardInput.WriteLine("exit");就可以循环下去了,但是strOutput到了是否要格式化下一张软盘后exit,再下一个循环strOutput是空,再下一个循环依然死在那边,无法正常往下执行
#15
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Process p = new Process();
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived+=new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived+=new DataReceivedEventHandler(p_ErrorDataReceived);
p.StartInfo.FileName = "ipconfig.exe";
p.StartInfo.Arguments = " /all";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.StartInfo.UseShellExecute = false;
p.Start();
//开始异步读取输出
p.BeginOutputReadLine();
//调用WaitForExit会等待Exited事件完成后再继续往下执行。
p.WaitForExit();
Console.WriteLine("exit");
}
void p_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里是正常的输出
Console.WriteLine(e.Data);
}
void p_ErrorDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里得到的是错误信息
Console.WriteLine(e.Data);
}
void p_Exited(Object sender, EventArgs e)
{
Console.WriteLine("finish");
}
}
}
#16
是不是p.StandardInput.WriteLine("exit");代表一个回车啊,我刚才最后一个提示是是否格式化下一张软盘,应该是p.StandardInput.WriteLine("N");p.StandardInput.WriteLine("exit");两句,是不是这样啊?我这么试了还是不行,奇怪了
我用了xingyuebuyu的方法做了异步操作,在读取数据的时候还是会死在那个提示后面,我在DOS界面下看到下一个应该没有内容了。
string strOutput;
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("N");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.BeginOutputReadLine();
p.WaitForExit();
}
p.Close();
我用了xingyuebuyu的方法做了异步操作,在读取数据的时候还是会死在那个提示后面,我在DOS界面下看到下一个应该没有内容了。
string strOutput;
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("N");
p.StandardInput.WriteLine("exit");
p.StandardInput.WriteLine("exit");
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.BeginOutputReadLine();
p.WaitForExit();
}
p.Close();
#17
建议你把“格式化软盘”的命令写在批处理里,直接调用批处理文件,然后按照我的方法用RichTextBox接收执行提示信息,也许情况不一样。
#18
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.StartInfo.UseShellExecute = false;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
p.Start();
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
//开始异步读取输出
p.BeginOutputReadLine();
p.BeginErrorReadLine();
//调用WaitForExit会等待Exited事件完成后再继续往下执行。
p.WaitForExit();
p.Close();
Console.WriteLine("exit");
}
void p_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里是正常的输出
Console.WriteLine(e.Data);
}
void p_ErrorDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里得到的是错误信息
Console.WriteLine(e.Data);
}
void p_Exited(Object sender, EventArgs e)
{
Console.WriteLine("finish");
}
}
}
此代码格式化G盘,测试OK,会触发Exited事件,楼上的说调用批处理文件应该也是可以的。
#19
xingyuebuyu:我用你的方法试了,用控制台应用程序来试验,结果应该和我的测试一样,那个DOS窗口开起来了,也看到程序执行完成,但是怎么让那个DOS窗口自动关闭呢,这个应该就是我在WINFORM里遇到的问题了,程序死在那边应该也是类似这个DOS窗口一直没有自动关闭
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件
#20
我在电脑上试过了格式化U盘,你全部用我的代码再试试,用winform的来试,控制台应用程序我倒没试过,现在是直接调用 format.com,而不是调用cmd.exe再执行格式化的.
#21
xingyuebuyu:我刚才试了用你的这两句确实可以正常到退出函数中
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
但是用p.StartInfo.FileName = "cmd.exe";
string strOutput;
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("N");
这样就不会正常执行到退出函数中
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
但是用p.StartInfo.FileName = "cmd.exe";
string strOutput;
strOutput = "format " + p_strDriverName + " /FS:FAT /Q";
p.StandardInput.WriteLine(strOutput);
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("N");
这样就不会正常执行到退出函数中
#22
最开始我也是这样的发现不能退出才改成用format.com的,至于为什么用 cmd.exe不能退出我也不知道具体的原因,所以你如果要通用的话还是要调用批处理文件,不过你这个的批处理文件我不会写,问其它人吧
#23
现在实验下来只能使用批处理的方式试试了,使用format.com,杀毒软件会自动禁止用户使用此命令,每台客户机都要去设置杀毒软件丢这个命令的权限,但是他可以通过异步的方式跟踪到错误和退出时的处理。
用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇
用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇
#24
DOS命令的没弄过。不知道怎么判断了
#25
在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。
#26
推荐
#27
学习一下,两下,三下!!!!!
#28
我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。
#29
学习一下,两下,三下!!!!!
#30
uP;
也谢谢这位,我之前也碰到这种问题,虽然从网上找了个办法解决了,但是一直不理解;
看了你的代码,基本弄清楚了
#31
学习一下,两下,三下!!!!!
#32
如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~
#33
这个批处理文件爱你怎么写啊?因为fomat的时候有很多提示,是否要怎样怎样,都要输入回车或者N的,怎么在批处理文件里写,执行就不会出现这些提示了?
#34
批处理文件中不知道如何使这些提示不出现
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...
是否要快速格式化另一张磁盘(Y/N)?
这两句不晓得怎么去掉提示
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...
是否要快速格式化另一张磁盘(Y/N)?
这两句不晓得怎么去掉提示
#35
搞定了,就用批处理的方式吧,下面这样就完全不会提示了,DOS语法太不熟悉
@echo off
echo y|format A: /FS:FAT /V: /Q
@echo off
echo y|format A: /FS:FAT /V: /Q
#36
晕了,没有看晕呀