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

长风大侠程序员 2010-02-24 11:51: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();
...全文
2613 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-11-05
  • 打赏
  • 举报
回复
晕了,没有看晕呀
  • 打赏
  • 举报
回复
搞定了,就用批处理的方式吧,下面这样就完全不会提示了,DOS语法太不熟悉
@echo off
echo y|format A: /FS:FAT /V: /Q
  • 打赏
  • 举报
回复
批处理文件中不知道如何使这些提示不出现
在驱动器 A: 中插入新磁盘
准备操作完成后请按 ENTER ...

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


这两句不晓得怎么去掉提示
  • 打赏
  • 举报
回复
引用 32 楼 hellowordc 的回复:
引用 28 楼 kelvin_2004 的回复:我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。

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

这个批处理文件爱你怎么写啊?因为fomat的时候有很多提示,是否要怎样怎样,都要输入回车或者N的,怎么在批处理文件里写,执行就不会出现这些提示了?
HELLOWORDC 2010-02-27
  • 打赏
  • 举报
回复
引用 28 楼 kelvin_2004 的回复:
我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。


如果用批处理,就不需要调CMD,也就不存在“如何正常退出”的问题了~
cppwizard_alvin 2010-02-27
  • 打赏
  • 举报
回复
学习一下,两下,三下!!!!!
nashina 2010-02-27
  • 打赏
  • 举报
回复
引用 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;
也谢谢这位,我之前也碰到这种问题,虽然从网上找了个办法解决了,但是一直不理解;
看了你的代码,基本弄清楚了
oneatree 2010-02-27
  • 打赏
  • 举报
回复
学习一下,两下,三下!!!!!
  • 打赏
  • 举报
回复
引用 25 楼 hellowordc 的回复:
引用 19 楼 kelvin_2004 的回复:批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件

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


我是在WINFORM里调用CMD的方式去格式化软盘,也不需要看到DOS界面,只要能正常抛出错误或正常退出即可。
b3366450 2010-02-26
  • 打赏
  • 举报
回复
学习下!!!!!!!!!呵呵 我也想知道
HELLOWORDC 2010-02-26
  • 打赏
  • 举报
回复
引用楼主 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接收执行提示:


相关程序如下:

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();
}
xh490290083 2010-02-26
  • 打赏
  • 举报
回复
学习一下,两下,三下!!!!!
Lucky_6Q 2010-02-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事件,楼上的说调用批处理文件应该也是可以的。
推荐
HELLOWORDC 2010-02-26
  • 打赏
  • 举报
回复
引用 19 楼 kelvin_2004 的回复:
批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件


在winform里调出远古的DOS界面,象什么样子?DOS的我试过了,把控制台调出后一直没有执行信息显示在黑屏中,也不知道什么原因,估计是DOS已经久远了,在某些细微的地方c#不支持呢?何必再去深究它,用RichTextBox能够接收到执行信息就OK了,何必一定要在DOS里显示?这样也象样子些,毕竟是Windows程序嘛,无论怎么说DOS那东西看上去已经很落伍了。
hnlyee 2010-02-26
  • 打赏
  • 举报
回复
DOS命令的没弄过。不知道怎么判断了
  • 打赏
  • 举报
回复
现在实验下来只能使用批处理的方式试试了,使用format.com,杀毒软件会自动禁止用户使用此命令,每台客户机都要去设置杀毒软件丢这个命令的权限,但是他可以通过异步的方式跟踪到错误和退出时的处理。
用cmd.exe会导致程序无法最终退出,不晓得有没有办法解决这个问题
我看了网上执行批处理的例子也使用cmd.exe的命令的,那一定也是无法解决自动退出的问题哇
xingyuebuyu 2010-02-26
  • 打赏
  • 举报
回复
最开始我也是这样的发现不能退出才改成用format.com的,至于为什么用 cmd.exe不能退出我也不知道具体的原因,所以你如果要通用的话还是要调用批处理文件,不过你这个的批处理文件我不会写,问其它人吧
  • 打赏
  • 举报
回复
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");

这样就不会正常执行到退出函数中
xingyuebuyu 2010-02-26
  • 打赏
  • 举报
回复
我在电脑上试过了格式化U盘,你全部用我的代码再试试,用winform的来试,控制台应用程序我倒没试过,现在是直接调用 format.com,而不是调用cmd.exe再执行格式化的.
  • 打赏
  • 举报
回复
xingyuebuyu:我用你的方法试了,用控制台应用程序来试验,结果应该和我的测试一样,那个DOS窗口开起来了,也看到程序执行完成,但是怎么让那个DOS窗口自动关闭呢,这个应该就是我在WINFORM里遇到的问题了,程序死在那边应该也是类似这个DOS窗口一直没有自动关闭

批处理的我还没有实验,还是倾向于用cmd命令来完成,尽量不在客户端处理新建删除批处理文件
加载更多回复(16)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧