C#执行cmd.exe 不能关闭问题

本文介绍了一种使用C#调用SQL Server备份的方法,避免了直接使用CMD执行命令所带来的进程无法关闭的问题。提供了两种实用的代码示例。

        目前做的项目中有一个功能是管理员能够手动的备份数据库(sqlserver 2012)。第一种方法便是用sqlserver的 backup 命令来实现。在这里就需要用csharp调用命令行来实现。在网上看到的方法全都是这种(用cmd工具来执行命令)

 /// <summary>
    /// 运行CMD命令
    /// </summary>
    /// <param name="cmd">命令</param>
    /// <param name="showWindow">是否显示执行窗体</param>
    /// <returns></returns>
    public static string ExecuteCmd(string[] cmd, bool showWindow)
    {
      Process p = new Process();
      p.StartInfo.FileName = "cmd.exe";
      //关闭shell的使用
      p.StartInfo.UseShellExecute = false;
      //重定向标准输入
      p.StartInfo.RedirectStandardInput = true;
      //重定向标准输出
      p.StartInfo.RedirectStandardOutput = true;
      //重定向标准错误
      p.StartInfo.RedirectStandardError = true;
      //是否显示窗体
      p.StartInfo.CreateNoWindow = !showWindow;
      p.Start();
      
      p.StandardInput.AutoFlush = true;
      for (int i = 0; i < cmd.Length; i++)
      {
        p.StandardInput.WriteLine(cmd[i].ToString());
      }
      p.StandardInput.WriteLine("exit");
      string strRst = p.StandardOutput.ReadToEnd();
      p.WaitForExit();
      p.Close();
      p.Dispose();
      return strRst;
    }

我觉得上面这种有个不好之处  当所执行的命名(程序)不是执行完就关闭(如 ftp osql 等命令)的时候就会出现cmd这个进程无法关闭导致程序卡死。

于是还不如直接执行该执行的程序(ftp.exe  osql.exe )下面是我的方法

<span style="white-space:pre">	</span>/// <summary>
       /// 通过命令行方式执行 程序
       /// </summary>
       /// <param name="app">程序名</param>
       /// <param name="argments">程序参数</param>
       /// <param name="cmd">进入程序后的命令</param>
       /// <param name="showWindow">是否显示窗口</param>
       /// <returns>命令行执行完后内容</returns>
        public static string ExecuteCmd(string app,string argments,string[] cmd, bool showWindow)
        {
            Process p = new Process();
            p.StartInfo.FileName = app;
            p.StartInfo.Arguments = argments;
            //关闭shell的使用
            p.StartInfo.UseShellExecute = false;
            //重定向标准输入
            p.StartInfo.RedirectStandardInput = true;
            //重定向标准输出
            p.StartInfo.RedirectStandardOutput = true;
            //重定向标准错误
            p.StartInfo.RedirectStandardError = true;
            //是否显示窗体
            p.StartInfo.CreateNoWindow = !showWindow;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            p.Dispose();
            return strRst;
        }


 
C#中调用CMD执行执行文件可以通过使用`System.Diagnostics`命名空间中的`Process`类来实现。这种方法允许程序启动一个新的进程,并与之交互。以下是一个详细的示例,展示了如何通过C#代码调用CMD执行一个`.exe`文件。 ### 示例代码 以下代码演示了如何启动CMD并运行一个外部的可执行文件(例如`notepad.exe`): ```csharp using System; using System.Diagnostics; class Program { static void Main() { // 创建一个新的进程启动信息 ProcessStartInfo processStartInfo = new ProcessStartInfo(); // 设置要启动的程序为CMD processStartInfo.FileName = "cmd.exe"; // 设置CMD执行的命令,这里以启动notepad.exe为例 processStartInfo.Arguments = "/C notepad.exe"; // /C 表示执行完命令后关闭CMD窗口 // 设置进程窗口的可见性 processStartInfo.CreateNoWindow = false; // 显示CMD窗口 processStartInfo.UseShellExecute = false; // 不使用操作系统外壳 // 启动进程 Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); // 等待进程执行完成 process.WaitForExit(); // 关闭进程 process.Close(); } } ``` ### 参数说明 - `FileName`: 设置要启动的程序名称,这里设置为`cmd.exe`。 - `Arguments`: 设置传递给CMD的参数,`/C`表示执行完命令后关闭CMD窗口,`notepad.exe`是要执行的可执行文件。 - `CreateNoWindow`: 如果设置为`false`,则会显示CMD窗口;如果设置为`true`,则不会显示窗口。 - `UseShellExecute`: 如果设置为`false`,则可以直接与进程交互;如果设置为`true`,则使用操作系统外壳来启动进程。 ### 执行其他可执行文件 如果需要执行其他可执行文件,只需将`Arguments`参数中的`notepad.exe`替换为实际的可执行文件路径即可。例如,如果有一个名为`myprogram.exe`的文件位于`C:\Program Files\MyProgram`目录下,则可以将`Arguments`设置为: ```csharp processStartInfo.Arguments = "/C \"C:\\Program Files\\MyProgram\\myprogram.exe\""; ``` 注意路径中包含空格时,需要用双引号包裹路径。 ### 高级用法:捕获CMD输出 如果需要捕获CMD执行的结果(例如输出到控制台的信息),可以通过重定向标准输出流来实现: ```csharp using System; using System.Diagnostics; class Program { static void Main() { ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.FileName = "cmd.exe"; processStartInfo.Arguments = "/C dir"; // 执行dir命令并捕获输出 processStartInfo.UseShellExecute = false; processStartInfo.RedirectStandardOutput = true; // 重定向标准输出 processStartInfo.CreateNoWindow = true; // 不显示CMD窗口 Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); // 读取输出 string output = process.StandardOutput.ReadToEnd(); Console.WriteLine("CMD Output:"); Console.WriteLine(output); process.WaitForExit(); process.Close(); } } ``` ### 注意事项 - **权限问题**:如果执行的可执行文件需要管理员权限,可能需要以管理员身份运行C#应用程序。 - **安全性**:确保传递给CMD的命令是安全的,避免注入攻击。对于用户输入的内容,应进行严格的验证和清理。 - **兼容性**:此方法适用于Windows平台,因为`cmd.exe`是Windows的命令解释器。 通过上述方法,可以轻松地在C#中调用CMD执行任何可执行文件。这种方法在自动化任务、脚本执行和系统管理中非常有用。[^2] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值