1、首先是创建新窗口,你会看到一个dos窗口;不适用外壳程序,则Process启动cmd.exe程序,但是运行时dos窗口不会显示任何字符,
public static string RunDosCommand(string cmd)
{
Process process = new Process();//实例
process.StartInfo.CreateNoWindow =false;//开启新窗口
process.StartInfo.UseShellExecute = false;//关闭Shell的使用
process.StartInfo.FileName = "cmd.exe"; //设定程序名
process.StartInfo.RedirectStandardInput = true; //重定向标准输入
process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
process.StartInfo.RedirectStandardError = true;//重定向错误输出
process.Start();
process.StandardInput.WriteLine(cmd);
process.WaitForExit();
string strRst = process.StandardOutput.ReadToEnd();
process.Close();
return strRst;
}
string output=ProcessHelper.CommanderHelper.RunDosCommand("ping baidu.com");
输出结果>
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>ping baidu.com
Pinging baidu.com [123.125.114.144] with 32 bytes of data:
Reply from 123.125.114.144: bytes=32 time=6ms TTL=128
Reply from 123.125.114.144: bytes=32 time=7ms TTL=128
Reply from 123.125.114.144: bytes=32 time=6ms TTL=128
Reply from 123.125.114.144: bytes=32 time=7ms TTL=128
Ping statistics for 123.125.114.144:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 7ms, Average = 6ms
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>
2、如果不创建新窗口,则会创建一个隐藏的cmd.exe,这里因为会等待cmd退出,所以必须使用任务管理器强制退出
public static string RunDosCommand(string cmd)
{
Process process = new Process();//实例
process.StartInfo.CreateNoWindow =true;//不开启新窗口
process.StartInfo.UseShellExecute = false;//关闭Shell的使用
process.StartInfo.FileName = "cmd.exe"; //设定程序名
process.StartInfo.RedirectStandardInput = true; //重定向标准输入
process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
process.StartInfo.RedirectStandardError = true;//重定向错误输出
process.Start();
process.StandardInput.WriteLine(cmd);
// process.StandardInput.WriteLine("exit");
process.WaitForExit();
string strRst = process.StandardOutput.ReadToEnd();
process.Close();
return strRst;
}
输出为:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>ping baidu.com
Pinging baidu.com [123.125.114.144] with 32 bytes of data:
Reply from 123.125.114.144: bytes=32 time=8ms TTL=128
Reply from 123.125.114.144: bytes=32 time=7ms TTL=128
Reply from 123.125.114.144: bytes=32 time=7ms TTL=128
Reply from 123.125.114.144: bytes=32 time=7ms TTL=128
Ping statistics for 123.125.114.144:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 7ms, Maximum = 8ms, Average = 7ms
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>
3、这里取消自动退出的注释
输出:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>ping baidu.com
Pinging baidu.com [123.125.114.144] with 32 bytes of data:
Reply from 123.125.114.144: bytes=32 time=8ms TTL=128
Request timed out.
Reply from 123.125.114.144: bytes=32 time=8ms TTL=128
Reply from 123.125.114.144: bytes=32 time=5ms TTL=128
Ping statistics for 123.125.114.144:
Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
Minimum = 5ms, Maximum = 8ms, Average = 7ms
D:\我的文档\Visual Studio 2010\Projects\SearchEngine\Test\bin\Debug>exit
4、这里开启Shell,则此时重定向标准输入输出都不可用,如果需要重定向IO,则UseShellExecute必须为false
public static string RunDosCommand(string cmd)
{
Process process = new Process();//实例
process.StartInfo.CreateNoWindow =true;//不开启新窗口
process.StartInfo.UseShellExecute = true;//Shell的使用
process.StartInfo.FileName = "cmd.exe"; //设定程序名
//process.StartInfo.RedirectStandardInput = true; //重定向标准输入
//process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
//process.StartInfo.RedirectStandardError = true;//重定向错误输出
process.Start();
process.StandardInput.WriteLine(cmd);
process.StandardInput.WriteLine("exit");
process.WaitForExit();
string strRst = process.StandardOutput.ReadToEnd();
process.Close();
return strRst;
}
尽管CreateNoWindow为true不创建新窗口,但是标准输入输出就是cmd窗口,所以还是会显示cmd窗口。在运行Start及之前的语句都正常。
process.StandardInput.WriteLine(cmd); 异常,显示standin尚未重定向。但是因为此时cmd就是外壳程序。
那么何时需要设置UseShellExecute为true呢??
如果将 ErrorDialog 属性设置为 true,则 UseShellExecute 必须为 true。
MSDN这样解释的:如果 UserName 属性不为 null 或不是一个空字符串,则 UseShellExecute 必须为 false,否则调用 Process.Start(ProcessStartInfo) 方法时将引发InvalidOperationException。
当您使用操作系统 shell 处理,使用 Process 对象,可以进行打开任何文档 (是任何注册的文件类型与可执行一个具有默认值打开事件) 并对文件进行操作,如打印。 当 UseShellExecute 是 false时,使用 Process 对象,start仅可执行文件。
WorkingDirectory 属性根据 UseShellExecute 属性的值有不同的行为。 当 UseShellExecute 为 true 时,WorkingDirectory 属性指定可执行文件的位置。 如果 WorkingDirectory 是空字符串,假定,当前目录包含可执行。
当 UseShellExecute 为 false 时,不使用 WorkingDirectory 属性查找可执行文件。 相反,启动并仅在意味着在的上下文中更新过程的过程只使用它。 当UseShellExecute 是 false时,FileName 属性必须是完全限定的路径可执行文件。
5、代码(阻塞和异步模式):
/// <summary>
/// 运行cmd命令,阻塞模式,退出后返回
/// </summary>
/// <param name="cmd"></param>
/// <returns></returns>
public static string RunDosCommand(string cmd)
{
Process process = new Process();//实例
process.StartInfo.CreateNoWindow =true;//不开启新窗口
process.StartInfo.UseShellExecute = false;//关闭Shell的使用
process.StartInfo.FileName = "cmd.exe"; //设定程序名
process.StartInfo.RedirectStandardInput = true; //重定向标准输入
process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
process.StartInfo.RedirectStandardError = true;//重定向错误输出
process.Start();
process.StandardInput.WriteLine(cmd);
process.StandardInput.WriteLine("exit");
process.WaitForExit();
string strRst = process.StandardOutput.ReadToEnd();
process.Close();
return strRst;
}
/// <summary>
/// 异步掉用,不阻塞现有程序
/// </summary>
/// <param name="cmd"></param>
public static void RunDosComandAsync(string cmd)
{
Process process = new Process();//实例
process.StartInfo.CreateNoWindow = true;//不开启新窗口
process.StartInfo.UseShellExecute = false;//关闭Shell的使用
process.StartInfo.FileName = "cmd.exe"; //设定程序名
process.StartInfo.RedirectStandardInput = true; //重定向标准输入
process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
process.StartInfo.RedirectStandardError = true;//重定向错误输出
process.Start();
process.StandardInput.WriteLine(cmd);
process.StandardInput.WriteLine("exit");
process.Close();
}
--------------------------------------------------------------------------------
其他博客的文章
using System.Diagnostics; //需要添加这行引用,关于线程的
private void button1_Click(object sender, EventArgs e)
{
string path = @"C:/Program Files/Tencent/QQ/QQ.exe";//这个path就是你要调用的exe程序的绝对路径
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "qq.exe";
process.StartInfo.WorkingDirectory = path;
process.StartInfo.CreateNoWindow =true ;
process.Start();
if (process.HasExited)
{
MessageBox.Show("complete");
}
}
还有其它的可以参考下面的网址
打开Windows图片和传真查看器打开图片,相关代码如下:
view plaincopy to clipboardprint?
//建立新的系统进程
System.Diagnostics.Process process = new System.Diagnostics.Process();
//设置文件名,此处为图片的真实路径+文件名
process.StartInfo.FileName = fileName;
//此为关键部分。设置进程运行参数,此时为最大化窗口显示图片。
process.StartInfo.Arguments = "rundll32.exe C://WINDOWS//system32//shimgvw.dll,ImageView_Fullscreen";
//此项为是否使用Shell执行程序,因系统默认为true,此项也可不设,但若设置必须为true
process.StartInfo.UseShellExecute = true;
//此处可以更改进程所打开窗体的显示样式,可以不设
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.Start();
process.Close();
//建立新的系统进程
System.Diagnostics.Process process = new System.Diagnostics.Process();
//设置文件名,此处为图片的真实路径+文件名
process.StartInfo.FileName = fileName;
//此为关键部分。设置进程运行参数,此时为最大化窗口显示图片。
process.StartInfo.Arguments = "rundll32.exe C://WINDOWS//system32//shimgvw.dll,ImageView_Fullscreen";
//此项为是否使用Shell执行程序,因系统默认为true,此项也可不设,但若设置必须为true
process.StartInfo.UseShellExecute = true;
//此处可以更改进程所打开窗体的显示样式,可以不设
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.Start();
process.Close();
最后的process.Close()方法可以不写,还可以换成process.WaitForExit()不过后者将会使程序暂停,直到打开的窗体被关闭,程序才会继续进行。