程序中运行dos命令

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()不过后者将会使程序暂停,直到打开的窗体被关闭,程序才会继续进行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值