C#执行外部程序之执行DOS命令和批处理

时间:2022-06-01 19:44:47

在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便。今天就来说一下C#中如何调用外部程序,执行一些特殊任务。

这里演示调用cmd.exe,即我们常用的DOS。

下面来看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace WinShell
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Execute(
"ver",10));
Console.Read();
}


/// <summary>
/// 执行DOS命令,返回DOS命令的输出
/// </summary>
/// <param name="dosCommand">dos命令</param>
/// <param name="milliseconds">等待命令执行的时间(单位:毫秒),
/// 如果设定为0,则无限等待</param>
/// <returns>返回DOS命令的输出</returns>
public static string Execute(string command, int seconds)
{
string output = ""; //输出字符串
if (command != null && !command.Equals(""))
{
Process process
= new Process();//创建进程对象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName
= "cmd.exe";//设定需要执行的命令
startInfo.Arguments = "/C " + command;//“/C”表示执行完命令后马上退出
startInfo.UseShellExecute = false;//不使用系统外壳程序启动
startInfo.RedirectStandardInput = false;//不重定向输入
startInfo.RedirectStandardOutput = true; //重定向输出
startInfo.CreateNoWindow = true;//不创建窗口
process.StartInfo = startInfo;
try
{
if (process.Start())//开始进程
{
if (seconds == 0)
{
process.WaitForExit();
//这里无限等待进程结束
}
else
{
process.WaitForExit(seconds);
//等待进程结束,等待时间为指定的毫秒
}
output
= process.StandardOutput.ReadToEnd();//读取进程的输出
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
//捕获异常,输出异常信息
}
finally
{
if (process != null)
process.Close();
}
}
return output;
}
}
}

这里调用DOS,执行查看版本的命令,然后获取执行结果,输出如下:

C#执行外部程序之执行DOS命令和批处理

直接输出结果,一点也不拖泥带水,是不是感觉很好!

下面来说下,如何执行批处理程序,即bat结尾的文件,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace WinShell
{
class Program
{
static void Main(string[] args)
{
Process pro
= new Process();
pro.StartInfo.FileName
= @"d:\1.bat";
pro.StartInfo.UseShellExecute
= false;
pro.StartInfo.RedirectStandardInput
= false;
pro.StartInfo.RedirectStandardOutput
= true;
pro.Start();
string result = pro.StandardOutput.ReadToEnd();
Console.WriteLine(result);

}

这个更加简单,直接把FileName的属性设置为批处理文件,将有Windows调用DOS执行,并且返回结果。

同理,我们可以通过DOS调用其他的很多程序。