C#使用Bat批处理修改当前运行程序的进程名

实现原理:

1、获取当前程序的进程名称

2、创建批处理bat文件,批处理bat文件一共实现四个功能:

  • 杀死当前进程,命令: taskkill /f /im 当前进程名称
  • 修改当前程序文件名,命令:ren 旧文件名 新文件名
  • 删除旧文件,命令:del /q /f 旧文件名程序全路径
  • 启动新的程序,命令:start {3} 新文件名程序全路径

3、运行bat文件 

先看一下效果图:

批处理工具类:BatUtils.cs

/// <summary>
    /// 批处理工具类
    /// </summary>
    class BatUtils
    {
        /// <summary>
        /// 写入bat文件
        /// </summary>
        /// <param name="fileContent"></param>
        /// <param name="filePath"></param>
        public static void writeBATFile(string fileContent, string filePath)
        {
            FileStream fs1 = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);//创建写入文件
            StreamWriter sw = new StreamWriter(fs1, Encoding.GetEncoding("GB2312"));
            sw.WriteLine(fileContent);//开始写入值
            sw.Close();
            fs1.Close();
        }
        /// <summary>
        /// 执行bat文件
        /// </summary>
        /// <param name="filePath">所在目录</param>
        /// <param name="fileName">文件名</param>
        public static bool runBATFile(string filePath, string fileName)
        {
            bool flag = false;
            Process proc = null;
            try
            {
                string targetDir = string.Format(filePath);
                proc = new Process();
                proc.StartInfo.WorkingDirectory = targetDir;
                proc.StartInfo.FileName = fileName;
                proc.StartInfo.Arguments = string.Format("10");
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//这里设置DOS窗口不显示
                proc.Start();
                proc.WaitForExit();
                proc.Close();
                flag = true;
            }
            catch (Exception ex)
            {
                flag = false;
                Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
            }
            return flag;
        }
        /// <summary>
        /// 运行cmd命令
        /// </summary>
        /// <param name="command"></param>
        public static void RunCmd(string command)
        {
            //不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
            //command = command.Trim().TrimEnd('&') + "&exit";
            using (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 = true;
                //启动程序
                p.Start();
                //向cmd窗口发送输入信息
                p.StandardInput.AutoFlush = true;
                p.StandardInput.WriteLine(command);
                //获取cmd窗口的输出信息
                //string output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
            }
        }
    }

Form1窗体代码:

 public partial class Form1 : Form
    {
        private string processName;//当前程序进程名
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //获取当前进程名称
            Process cur = Process.GetCurrentProcess();
            processName = cur.ProcessName;
            this.Text = processName;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            string appName = txtAppName.Text.Trim();
            if (appName == string.Empty)
            {
                MessageBox.Show("请输入程序名称");
                return;
            }
            if (!appName.Contains(".exe"))
                appName += ".exe";
            string newFilePath = Environment.CurrentDirectory + "//" + appName;
            //正在运行的程序路径和文件名
            string oldFilePath = Application.ExecutablePath;
            string appBat = String.Format(@"
            @echo off
            taskkill /f /im {0}
            ren {0} {1}
            del /q /f {2} 
            start {3}", processName+".exe", appName, oldFilePath, newFilePath);
            BatUtils.writeBATFile(appBat, "修改进程名.bat");
            //隐藏文件          
            FileInfo fi = new FileInfo(Environment.CurrentDirectory + "\\修改进程名.bat");
            fi.Attributes = fi.Attributes | FileAttributes.Hidden;
            if (File.Exists("修改进程名.bat"))
            {
                BatUtils.runBATFile(Environment.CurrentDirectory, "修改进程名.bat");
            }
        }

    }