C#下使用DOS命令怎么判断是否执行成功,怎么退出

时间:2022-09-02 20:24:58
   今天看到网上一篇文章写如何在C#下格式化磁盘分区的,我试着做了一个格式化软盘的程序,但是执行到p.WaitForExit();就死在那边了,不晓得为什么,也不晓得怎么判断是否执行成功
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中

#3


mark 回复内容太短了! 

#4


你在读到的strOutput中查找 DOS命令成功执行后的所含有的字符串就可以了啊,如果没有查找到就是执行失败了啊,你还可以读StandardError,查看读到的内容确定失败的原因.

#5


使用日志记录操作结果

#6


最简单的方法:
在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


引用楼主 kelvin_2004 的回复:
  今天看到网上一篇文章写如何在C#下格式化磁盘分区的,我试着做了一个格式化软盘的程序,但是执行到p.WaitForExit();就死在那边了,不晓得为什么,也不晓得怎么判断是否执行成功
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
                p.StandardInput.WriteLine(strOutput);
                p.StandardInput.WriteLine("exit");
                while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
                {
                    strOutput = p.StandardOutput.ReadLine();
                    Console.WriteLine(strOutput);
                }
                p.WaitForExit();


  while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)

你要想知道是否执行成功,可以做成这样效果,用一个RichTextBox接收执行提示:
C#下使用DOS命令怎么判断是否执行成功,怎么退出

相关程序如下:

 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 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数

#13


我晓得了,正在初始化文件分配表 后面是提示是否输入卷盘,回车后还会提示是否格式化下一张盘,都要用户按回车的,是不是这个地方死在那边了?我前面已经写了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();

#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命令来完成,尽量不在客户端处理新建删除批处理文件

#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");

这样就不会正常执行到退出函数中

#22


最开始我也是这样的发现不能退出才改成用format.com的,至于为什么用 cmd.exe不能退出我也不知道具体的原因,所以你如果要通用的话还是要调用批处理文件,不过你这个的批处理文件我不会写,问其它人吧

#23


现在实验下来只能使用批处理的方式试试了,使用format.com,杀毒软件会自动禁止用户使用此命令,每台客户机都要去设置杀毒软件丢这个命令的权限,但是他可以通过异步的方式跟踪到错误和退出时的处理。
   用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
   我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇

#24


DOS命令的没弄过。不知道怎么判断了

#25


引用 19 楼 kelvin_2004 的回复:
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件


在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。

#26


引用 18 楼 xingyuebuyu 的回复:
C# codeusing 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
{publicpartialclass Form1 : Form
    {public Form1()
        {
            InitializeComponent();
        }privatevoid 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事件,楼上的说调用批处理文件应该也是可以的。
推荐

#27


学习一下,两下,三下!!!!!

#28


引用 25 楼 hellowordc 的回复:
引用 19 楼 kelvin_2004 的回复:批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件

在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。


我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。

#29


学习一下,两下,三下!!!!!

#30


引用 18 楼 xingyuebuyu 的回复:
C# codeusing 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
{publicpartialclass Form1 : Form
    {public Form1()
        {
            InitializeComponent();
        }privatevoid 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事件,楼上的说调用批处理文件应该也是可以的。

uP;
也谢谢这位,我之前也碰到这种问题,虽然从网上找了个办法解决了,但是一直不理解;
看了你的代码,基本弄清楚了

#31


学习一下,两下,三下!!!!!

#32


引用 28 楼 kelvin_2004 的回复:
我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。


如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~

#33


引用 32 楼 hellowordc 的回复:
引用 28 楼 kelvin_2004 的回复:我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。

如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~

这个批处理文件爱你怎么写啊?因为fomat的时候有很多提示,是否要怎样怎样,都要输入回车或者N的,怎么在批处理文件里写,执行就不会出现这些提示了?

#34


批处理文件中不知道如何使这些提示不出现
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...

是否要快速格式化另一张磁盘(Y/N)?


这两句不晓得怎么去掉提示

#35


搞定了,就用批处理的方式吧,下面这样就完全不会提示了,DOS语法太不熟悉
@echo off
echo y|format A: /FS:FAT /V: /Q

#36


晕了,没有看晕呀
C#下使用DOS命令怎么判断是否执行成功,怎么退出

#1



 Boolean bNext = false;
            while (!p.HasExited)
            {
                bNext = p.HasExited;
                if (bNext)
                    break;
            }

试一下

#2


不行,p.HasExited 一直是false
有没有什么办法可以判断DOS命令有没有成功执行,如果成功了就退出,不成功抛出错误原因,我现在发现CMD执行DOS命令即便不成功也不会抛出异常,直接就正常退出函数了,没有跑到catch中

#3


mark 回复内容太短了! 

#4


你在读到的strOutput中查找 DOS命令成功执行后的所含有的字符串就可以了啊,如果没有查找到就是执行失败了啊,你还可以读StandardError,查看读到的内容确定失败的原因.

#5


使用日志记录操作结果

#6


最简单的方法:
在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


引用楼主 kelvin_2004 的回复:
  今天看到网上一篇文章写如何在C#下格式化磁盘分区的,我试着做了一个格式化软盘的程序,但是执行到p.WaitForExit();就死在那边了,不晓得为什么,也不晓得怎么判断是否执行成功
strOutput = "format "+p_strDriverName+" /FS:FAT /Q";
                p.StandardInput.WriteLine(strOutput);
                p.StandardInput.WriteLine("exit");
                while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)
                {
                    strOutput = p.StandardOutput.ReadLine();
                    Console.WriteLine(strOutput);
                }
                p.WaitForExit();


  while (p.StandardOutput.EndOfStream)//这里写错了,应为!(p.StandardOutput.EndOfStream)

你要想知道是否执行成功,可以做成这样效果,用一个RichTextBox接收执行提示:
C#下使用DOS命令怎么判断是否执行成功,怎么退出

相关程序如下:

 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 中虽然有文字信息,但是也不知道碰到有错误怎么退出函数

#13


我晓得了,正在初始化文件分配表 后面是提示是否输入卷盘,回车后还会提示是否格式化下一张盘,都要用户按回车的,是不是这个地方死在那边了?我前面已经写了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();

#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命令来完成,尽量不在客户端处理新建删除批处理文件

#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");

这样就不会正常执行到退出函数中

#22


最开始我也是这样的发现不能退出才改成用format.com的,至于为什么用 cmd.exe不能退出我也不知道具体的原因,所以你如果要通用的话还是要调用批处理文件,不过你这个的批处理文件我不会写,问其它人吧

#23


现在实验下来只能使用批处理的方式试试了,使用format.com,杀毒软件会自动禁止用户使用此命令,每台客户机都要去设置杀毒软件丢这个命令的权限,但是他可以通过异步的方式跟踪到错误和退出时的处理。
   用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
   我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇

#24


DOS命令的没弄过。不知道怎么判断了

#25


引用 19 楼 kelvin_2004 的回复:
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件


在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。

#26


引用 18 楼 xingyuebuyu 的回复:
C# codeusing 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
{publicpartialclass Form1 : Form
    {public Form1()
        {
            InitializeComponent();
        }privatevoid 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事件,楼上的说调用批处理文件应该也是可以的。
推荐

#27


学习一下,两下,三下!!!!!

#28


引用 25 楼 hellowordc 的回复:
引用 19 楼 kelvin_2004 的回复:批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件

在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。


我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。

#29


学习一下,两下,三下!!!!!

#30


引用 18 楼 xingyuebuyu 的回复:
C# codeusing 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
{publicpartialclass Form1 : Form
    {public Form1()
        {
            InitializeComponent();
        }privatevoid 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事件,楼上的说调用批处理文件应该也是可以的。

uP;
也谢谢这位,我之前也碰到这种问题,虽然从网上找了个办法解决了,但是一直不理解;
看了你的代码,基本弄清楚了

#31


学习一下,两下,三下!!!!!

#32


引用 28 楼 kelvin_2004 的回复:
我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。


如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~

#33


引用 32 楼 hellowordc 的回复:
引用 28 楼 kelvin_2004 的回复:我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。

如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~

这个批处理文件爱你怎么写啊?因为fomat的时候有很多提示,是否要怎样怎样,都要输入回车或者N的,怎么在批处理文件里写,执行就不会出现这些提示了?

#34


批处理文件中不知道如何使这些提示不出现
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...

是否要快速格式化另一张磁盘(Y/N)?


这两句不晓得怎么去掉提示

#35


搞定了,就用批处理的方式吧,下面这样就完全不会提示了,DOS语法太不熟悉
@echo off
echo y|format A: /FS:FAT /V: /Q

#36


晕了,没有看晕呀
C#下使用DOS命令怎么判断是否执行成功,怎么退出