windows顺序程序启动器

win/linux开机启动exe程序 1.找到启动文件夹:按下 Win + R 打开运行对话框,输入 shell:startup,然后按回车。这会打开当前用户的启动文件夹。如果你想为所有用户设置启动项,可以输入 shell:common startup。2.创建快捷方式:找到你想要开机启动的exe文件,右键点击它,选择“创建快捷方式”。将创建的快捷方式复制到刚才打开的启动文件夹中。 阅读详情

windows顺序程序启动器

一、前言:为什么要做这个工具?
给客户部署,有时候如果程序很多都需要开机自启,所以做了这个工具。

二、工具核心功能亮点

核心能力:支持添加 EXE、BAT 文件,按自定义顺序批量启动
配置持久化:配置文件(config.json)与 EXE 同级
人性化设计:使用日志记录启动记录,窗口居中

程序备注:支持给每个程序加备注
重复校验:避免添加相同路径的程序
序号自动校准:删除 / 移动程序后,序号自动连续

双启动模式:
普通模式:可视化界面操作(添加 / 删除 / 调整顺序 / 手动启动)
自动模式:静默运行,启动完所有程序后自动退出(支持 1 分钟超时强制退出)

四、使用教程:两步上手
4.1 普通模式(可视化操作)

运行工具:主窗口自动居中,显示已保存的程序列表
添加程序:点击「添加」→ 选择 EXE/BAT 文件(自动填充备注)→ 确认
管理列表:选中程序后可「删除」「上移 / 下移」调整顺序
启动程序:点击「启动」,按序号依次启动,状态栏显示进度

4.3 配置文件说明

路径:与启动器 EXE 同级,文件名config.json
手动修改:可直接编辑 JSON 调整程序顺序、备注(注意序号连续)
备份恢复:复制config.json即可备份,换设备时粘贴到新 EXE 目录

使用教程

双击显示启动倒计时,如果没有取消就会自动启动,点击取消就会进入图形界面可以编辑启动顺序

在这里插入图片描述

点击立即执行就会立刻启动执行程序,点击取消会进入编辑界面,可以手动启动。

在这里插入图片描述

代码

项目入口

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SequentialProgramLauncher
{
    internal static class Program
    {
        private static readonly string LogFilePath = Path.Combine(
            Path.GetDirectoryName(Application.ExecutablePath) ?? AppDomain.CurrentDomain.BaseDirectory,
            "ProgramLauncher.log");

        /// <summary>
        /// 应用程序的主入口点
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {

            LogMessage("----------", "------------------------------");

            // 初始化日志
            LogMessage("程序启动", $"命令行参数: {(args.Length > 0 ? string.Join(" ", args) : "无")}");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 检查命令行参数:如果有 --auto 参数,则自动执行
            if (args.Length > 0 && args[0].Equals("--auto", StringComparison.OrdinalIgnoreCase))
            {
                LogMessage("模式选择", "使用命令行自动执行模式");
                // 自动执行程序
                RunAutoModeAsync().Wait();
            }
            else
            {
                LogMessage("模式选择", "使用图形界面模式");
                // 图形界面模式
                Application.Run(new Form1());
            }
        }

        /// <summary>
        /// 异步执行命令行自动模式逻辑
        /// </summary>
        private static async Task RunAutoModeAsync()
        {
            LogMessage("自动模式", "开始执行自动启动程序");

            // 1. 定时30分钟自毁(安全备份)- 修改为30分钟
            _ = Task.Run(async () =>
            {
                await Task.Delay(TimeSpan.FromMinutes(30));
                LogMessage("超时保护", "30分钟超时,强制退出");
                Environment.Exit(0);
            });

            // 2. 执行自动任务
            Form1 form = new Form1();
            await form.AutoRunPrograms();

            LogMessage("自动模式", "任务完成,程序退出");
            Environment.Exit(0);
        }

        /// <summary>
        /// 记录日志消息
        /// </summary>
        /// <param name="category">日志类别</param>
        /// <param name="message">日志内容</param>
        public static void LogMessage(string category, string message)
        {
            try
            {
                string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{category}] {message}";
                File.AppendAllText(LogFilePath, logEntry + Environment.NewLine);
                Console.WriteLine(logEntry); // 同时在控制台输出(如果有)
            }
            catch (Exception ex)
            {
                Console.WriteLine($"日志写入失败: {ex.Message}");
            }
        }
    }
}


项目逻辑

 using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SequentialProgramLauncher
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 程序列表 - 存储所有待启动程序的配置信息
        /// </summary>
        private List<ProgramItem> _programList = new List<ProgramItem>();

        /// <summary>
        /// 配置文件路径 - 存储程序列表配置的JSON文件路径(与EXE同目录)
        /// </summary>
        private readonly string _configPath;

        /// <summary>
        /// 等待时间 
        /// </summary>
        private readonly int _waitingTime = 2000;

        private System.Windows.Forms.Timer _countdownTimer;
        private int _countdownSeconds = 10;
        private bool _autoStarted = false;

        /// <summary>
        /// 主窗体构造函数
        /// </summary>
        public Form1()
        {
            InitializeComponent();

            // 设置主窗口启动时在屏幕正中间
            this.StartPosition = FormStartPosition.CenterScreen;

            // 配置文件路径设置:与当前执行程序(EXE)同级目录
            string exePath = Application.ExecutablePath;       // 获取EXE完整路径(含文件名)
            string exeDirectory = Path.GetDirectoryName(exePath); // 提取EXE所在文件夹路径
            _configPath = Path.Combine(exeDirectory, "config.json"); // 拼接配置文件完整路径

            // 初始化列表视图列结构(包含序号、程序名称、备注、程序路径)
            InitListViewColumns();

            // 加载已保存的配置信息并更新界面显示
            LoadConfig();
            UpdateProgramList();

            // 启动倒计时提示
            StartCountdownPrompt();
        }

        /// <summary>
        /// 启动倒计时提示
        /// </summary>
        private void StartCountdownPrompt()
        {
            Program.LogMessage("界面提示", "显示倒计时提示窗口");

            // 创建倒计时标签
            Label countdownLabel = new Label
            {
                Text = $"10秒内不关闭提示窗口会自动开始执行自动启动程序。\n\n倒计时: 10秒",
                Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))),
                TextAlign = System.Drawing.ContentAlignment.MiddleCenter,
                AutoSize = false,
                Size = new System.Drawing.Size(400, 100),
                Location = new System.Drawing.Point(20, 20)
            };

            // 创建提示窗体
            Form promptForm = new Form
            {
                Text = "自动启动提示",
                Size = new System.Drawing.Size(440, 200),
                StartPosition = FormStartPosition.CenterParent,
                FormBorderStyle = FormBorderStyle.FixedDialog,
                MaximizeBox = false,
                MinimizeBox = false,
                ShowInTaskbar = false,
                TopMost = true
            };

            // 创建关闭按钮
            Button closeButton = new Button
            {
                Text = "取消",
                Size = new System.Drawing.Size(100, 30),
                Location = new System.Drawing.Point(170, 130)
            };
            closeButton.Click += (s, e) =>
            {
                Program.LogMessage("用户操作", "用户取消了自动启动");
                promptForm.DialogResult = DialogResult.Cancel;
                promptForm.Close();
            };

            // 创建立即执行按钮
            Button executeNowButton = new Button
            {
                Text = "立即执行",
                Size = new System.Drawing.Size(100, 30),
                Location = new System.Drawing.Point(50, 130)
            };
            executeNowButton.Click += (s, e) =>
            {
                Program.LogMessage("用户操作", "用户选择立即执行");
                _autoStarted = true;
                promptForm.DialogResult = DialogResult.OK;
                promptForm.Close();
            };

            promptForm.Controls.Add(countdownLabel);
            promptForm.Controls.Add(closeButton);
            promptForm.Controls.Add(executeNowButton);

            // 创建倒计时定时器
            _countdownTimer = new System.Windows.Forms.Timer
            {
                Interval = 1000 // 1秒
            };
            _countdownSeconds = 10;

            _countdownTimer.Tick += (s, e) =>
            {
                _countdownSeconds--;

                if (_countdownSeconds > 0)
                {
                    countdownLabel.Text = $"10秒内不关闭提示窗口会自动开始执行自动启动程序。\n\n倒计时: {_countdownSeconds}秒";
                    Application.DoEvents(); // 强制刷新UI
                }
                else
                {
                    _countdownTimer.Stop();
                    Program.LogMessage("自动启动", "倒计时结束,开始自动执行程序");
                    _autoStarted = true;
                    promptForm.DialogResult = DialogResult.OK;
                    promptForm.Close();
                }
            };

            promptForm.FormClosed += async (s, e) =>
            {
                _countdownTimer?.Stop();
                if (_autoStarted && promptForm.DialogResult == DialogResult.OK)
                {
                    await StartProgramsAsync();
                }
            };

            // 显示提示窗体
            _countdownTimer.Start();
            promptForm.ShowDialog(this);
        }


        /// <summary>
        /// 初始化列表视图的列结构
        /// 定义列名、宽度等显示属性,支持程序信息的多维度展示
        /// </summary>
        private void InitListViewColumns()
        {
            lvPrograms.Columns.Clear();
            lvPrograms.Columns.AddRange(new ColumnHeader[]
            {
                new ColumnHeader { Text = "序号", Width = 60 },    // 程序执行顺序序号
                new ColumnHeader { Text = "程序名称", Width = 150 },// 程序文件名(不含扩展名)
                new ColumnHeader { Text = "备注", Width = 180 },    // 程序描述备注信息
                new ColumnHeader { Text = "程序路径", Width = 400 } // 程序文件完整路径
            });
        }

        #region 配置文件操作模块
        /// <summary>
        /// 从配置文件加载程序列表数据
        /// 支持JSON格式反序列化,自动处理序号连续性
        /// </summary>
        private void LoadConfig()
        {
            try
            {
                // 检查配置文件是否存在
                if (File.Exists(_configPath))
                {
                    // 读取JSON配置内容(UTF-8编码)
                    string jsonContent = File.ReadAllText(_configPath, System.Text.Encoding.UTF8);

                    // 反序列化为程序列表对象,若解析失败则创建空列表
                    _programList = JsonConvert.DeserializeObject<List<ProgramItem>>(jsonContent) ?? new List<ProgramItem>();

                    // 确保程序序号连续且按升序排列
                    _programList = _programList.OrderBy(item => item.Order).ToList();
                    for (int i = 0; i < _programList.Count; i++)
                    {
                        _programList[i].Order = i + 1; // 重新分配连续序号(1开始)
                    }

                    Program.LogMessage("配置加载", $"成功加载 {_programList.Count} 个程序配置");
                }
                else
                {
                    Program.LogMessage("配置加载", "配置文件不存在,使用空列表");
                }
            }
            catch (Exception ex)
            {
                // 异常处理:提示加载失败信息并初始化空列表
                Program.LogMessage("配置加载错误", ex.Message);
                MessageBox.Show($"配置加载失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                _programList = new List<ProgramItem>();
            }
        }

        /// <summary>
        /// 将当前程序列表数据保存到配置文件
        /// 支持JSON格式序列化,确保数据持久化
        /// </summary>
        private void SaveConfig()
        {
            try
            {
                // 按序号排序后序列化为JSON字符串
                string jsonContent = JsonConvert.SerializeObject(_programList.OrderBy(item => item.Order));

                // 写入配置文件(UTF-8编码)
                File.WriteAllText(_configPath, jsonContent, System.Text.Encoding.UTF8);
                Program.LogMessage("配置保存", $"成功保存 {_programList.Count} 个程序配置");
            }
            catch (Exception ex)
            {
                // 异常处理:提示保存失败信息
                Program.LogMessage("配置保存错误", ex.Message);
                MessageBox.Show($"配置保存失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        #region 界面更新模块
        /// <summary>
        /// 更新列表视图显示
        /// 同步程序列表数据到界面,展示序号、名称、备注、路径信息
        /// </summary>
        private void UpdateProgramList()
        {
            // 清空现有列表项
            lvPrograms.Items.Clear();

            // 按序号排序后逐个添加到列表视图
            foreach (var programItem in _programList.OrderBy(item => item.Order))
            {
                // 创建列表项(序号为第一列)
                ListViewItem listViewItem = new ListViewItem(programItem.Order.ToString());

                // 添加子项:程序名称、备注(无则显示"无")、程序路径
                listViewItem.SubItems.Add(programItem.Name);
                listViewItem.SubItems.Add(string.IsNullOrEmpty(programItem.Remark) ? "无" : programItem.Remark);
                listViewItem.SubItems.Add(programItem.Path);

                // 添加到列表视图
                lvPrograms.Items.Add(listViewItem);
            }
        }
        #endregion

        #region 按钮事件处理模块
        /// <summary>
        /// 添加程序按钮点击事件
        /// 打开添加程序弹窗,获取用户输入的程序路径和备注信息
        /// </summary>
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Program.LogMessage("用户操作", "点击添加程序按钮");

            // 创建添加程序弹窗(使用using确保自动释放资源)
            using (AddProgramForm addProgramForm = new AddProgramForm())
            {
                #region 弹窗位置优化:设置为相对于主窗体居中显示
                // 计算弹窗位置:主窗体中心坐标 - 弹窗一半尺寸
                int formLeft = this.Left + (this.Width - addProgramForm.Width) / 2;
                int formTop = this.Top + (this.Height - addProgramForm.Height) / 2;

                // 设置弹窗位置(确保不超出屏幕边界)
                addProgramForm.StartPosition = FormStartPosition.Manual;
                addProgramForm.Location = new System.Drawing.Point(
                    Math.Max(0, formLeft),  // 左边界不小于屏幕左边缘
                    Math.Max(0, formTop)    // 上边界不小于屏幕上边缘
                );
                #endregion

                // 显示弹窗(指定主窗体为所有者,确保模态显示)
                if (addProgramForm.ShowDialog(this) == DialogResult.OK)
                {
                    // 获取弹窗返回的程序路径和备注
                    string selectedFilePath = addProgramForm.SelectedPath;
                    string inputRemark = addProgramForm.InputRemark;
                    string programName = Path.GetFileNameWithoutExtension(selectedFilePath);

                    Program.LogMessage("添加程序", $"文件: {programName}, 路径: {selectedFilePath}, 备注: {inputRemark}");

                    // 重复校验:避免添加相同路径的程序
                    if (_programList.Any(item => item.Path.Equals(selectedFilePath, StringComparison.OrdinalIgnoreCase)))
                    {
                        Program.LogMessage("添加程序", "程序已存在于列表中");
                        MessageBox.Show("该程序已存在于列表中,无需重复添加!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    // 计算新程序的序号(最大序号+1,无数据时为1)
                    int newItemOrder = _programList.Any() ? _programList.Max(item => item.Order) + 1 : 1;

                    // 添加新程序到列表
                    _programList.Add(new ProgramItem
                    {
                        Order = newItemOrder,
                        Name = programName,
                        Path = selectedFilePath,
                        Remark = inputRemark
                    });

                    Program.LogMessage("添加程序", $"成功添加程序,新序号: {newItemOrder}");

                    // 保存配置并更新界面
                    SaveConfig();
                    UpdateProgramList();
                }
            }
        }

        /// <summary>
        /// 删除程序按钮点击事件
        /// 删除选中的程序项,并重排序号确保连续性
        /// </summary>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            Program.LogMessage("用户操作", "点击删除程序按钮");

            // 校验:是否选中程序项
            if (lvPrograms.SelectedItems.Count == 0)
            {
                MessageBox.Show("请先在列表中选择要删除的程序!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 确认删除操作
            if (MessageBox.Show("确定要删除选中的程序吗?删除后不可恢复!", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                // 获取选中项的序号
                int selectedItemOrder = int.Parse(lvPrograms.SelectedItems[0].Text);
                string programName = lvPrograms.SelectedItems[0].SubItems[1].Text;

                Program.LogMessage("删除程序", $"序号: {selectedItemOrder}, 程序: {programName}");

                // 从列表中移除对应程序项
                _programList.RemoveAll(item => item.Order == selectedItemOrder);

                // 重新排序并分配连续序号
                var orderedProgramList = _programList.OrderBy(item => item.Order).ToList();
                for (int i = 0; i < orderedProgramList.Count; i++)
                {
                    orderedProgramList[i].Order = i + 1;
                }
                _programList = orderedProgramList;

                Program.LogMessage("删除程序", "成功删除并重新排序");

                // 保存配置并更新界面
                SaveConfig();
                UpdateProgramList();
            }
        }

        /// <summary>
        /// 上移按钮点击事件
        /// 调整选中程序的执行顺序(向上移动一位)
        /// </summary>
        private void btnMoveUp_Click(object sender, EventArgs e)
        {
            Program.LogMessage("用户操作", "点击上移按钮");

            // 校验:是否选中程序项,且不是第一个项
            if (lvPrograms.SelectedItems.Count == 0 || lvPrograms.SelectedItems[0].Index == 0)
            {
                MessageBox.Show("当前程序已在第一位,无法上移!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 获取选中项的序号和对应的程序对象
            int selectedItemOrder = int.Parse(lvPrograms.SelectedItems[0].Text);
            var selectedProgram = _programList.First(item => item.Order == selectedItemOrder);
            var previousProgram = _programList.First(item => item.Order == selectedItemOrder - 1);

            Program.LogMessage("移动程序", $"将程序 {selectedProgram.Name} 从位置 {selectedItemOrder} 移动到 {selectedItemOrder - 1}");

            // 交换序号(实现位置上移)
            int tempOrder = selectedProgram.Order;
            selectedProgram.Order = previousProgram.Order;
            previousProgram.Order = tempOrder;

            // 保存配置并更新界面
            SaveConfig();
            UpdateProgramList();

            // 保持选中状态(上移后选中前一个位置)
            lvPrograms.Items[selectedItemOrder - 2].Selected = true;
        }

        /// <summary>
        /// 下移按钮点击事件
        /// 调整选中程序的执行顺序(向下移动一位)
        /// </summary>
        private void btnMoveDown_Click(object sender, EventArgs e)
        {
            Program.LogMessage("用户操作", "点击下移按钮");

            // 校验:是否选中程序项,且不是最后一个项
            if (lvPrograms.SelectedItems.Count == 0 || lvPrograms.SelectedItems[0].Index == lvPrograms.Items.Count - 1)
            {
                MessageBox.Show("当前程序已在最后一位,无法下移!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 获取选中项的序号和对应的程序对象
            int selectedItemOrder = int.Parse(lvPrograms.SelectedItems[0].Text);
            var selectedProgram = _programList.First(item => item.Order == selectedItemOrder);
            var nextProgram = _programList.First(item => item.Order == selectedItemOrder + 1);

            Program.LogMessage("移动程序", $"将程序 {selectedProgram.Name} 从位置 {selectedItemOrder} 移动到 {selectedItemOrder + 1}");

            // 交换序号(实现位置下移)
            int tempOrder = selectedProgram.Order;
            selectedProgram.Order = nextProgram.Order;
            nextProgram.Order = tempOrder;

            // 保存配置并更新界面
            SaveConfig();
            UpdateProgramList();

            // 保持选中状态(下移后选中后一个位置)
            lvPrograms.Items[selectedItemOrder].Selected = true;
        }

        /// <summary>
        /// 启动按钮点击事件
        /// 异步启动所有程序(按序号顺序)
        /// </summary>
        private async void btnStart_Click(object sender, EventArgs e)
        {
            Program.LogMessage("用户操作", "点击手动启动按钮");
            // 异步执行程序启动逻辑(避免阻塞UI)
            await StartProgramsAsync();
        }


        public async Task StartProgramsAsync()
        {
            Program.LogMessage("程序启动", $"开始执行程序列表,共 {_programList.Count} 个程序");

            // 校验:程序列表是否为空
            if (!_programList.Any())
            {
                Program.LogMessage("程序启动", "程序列表为空");
                MessageBox.Show("程序列表为空,请先添加需要启动的程序!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 禁用操作按钮(避免并发操作)
            SetButtonsEnabled(false);

            // 创建列表来记录启动失败的程序
            List<string> failedPrograms = new List<string>();
            List<string> notFoundPrograms = new List<string>();

            try
            {
                // 按序号顺序遍历程序列表
                foreach (var programItem in _programList.OrderBy(item => item.Order))
                {
                    // 构建显示名称(包含备注信息)
                    string displayName = string.IsNullOrEmpty(programItem.Remark)
                        ? programItem.Name
                        : $"{programItem.Name}({programItem.Remark})";

                    // 校验程序文件是否存在
                    if (File.Exists(programItem.Path))
                    {
                        try
                        {
                            Program.LogMessage("启动程序", $"正在启动: {displayName} ({programItem.Path})");

                            // 更新状态提示
                            lblStatus.Text = $"正在启动:{displayName}...";
                            Application.DoEvents(); // 刷新UI显示

                            // 获取文件扩展名
                            string fileExtension = Path.GetExtension(programItem.Path).ToLower();

                            // 启动程序进程
                            using (var process = new System.Diagnostics.Process())
                            {
                                // 如果是批处理文件,使用cmd /k保持窗口打开
                                if (fileExtension == ".bat" || fileExtension == ".cmd")
                                {
                                    // 使用cmd /k 保持窗口打开
                                    process.StartInfo.FileName = "cmd.exe";
                                    process.StartInfo.Arguments = $"/k \"{programItem.Path}\"";
                                    process.StartInfo.WorkingDirectory = Path.GetDirectoryName(programItem.Path);
                                    process.StartInfo.UseShellExecute = true;
                                }
                                else
                                {
                                    // 其他类型文件按原方式启动
                                    process.StartInfo.FileName = programItem.Path;
                                    process.StartInfo.WorkingDirectory = Path.GetDirectoryName(programItem.Path);
                                    process.StartInfo.UseShellExecute = true;
                                }

                                bool started = process.Start(); // 启动进程

                                if (started)
                                {
                                    // 更新启动成功状态
                                    lblStatus.Text = $"已启动:{displayName}";
                                    Program.LogMessage("启动程序", $"成功启动: {displayName}");
                                }
                                else
                                {
                                    // 启动失败
                                    failedPrograms.Add(displayName);
                                    Program.LogMessage("启动失败", $"无法启动: {displayName}");
                                    lblStatus.Text = $"启动失败:{displayName}";
                                }

                                await Task.Delay(_waitingTime);
                            }
                        }
                        catch (Exception ex)
                        {
                            // 启动过程中出现异常
                            failedPrograms.Add(displayName);
                            Program.LogMessage("启动异常", $"{displayName}: {ex.Message}");
                            lblStatus.Text = $"启动异常:{displayName}";
                        }
                    }
                    else
                    {
                        // 程序文件不存在的处理
                        notFoundPrograms.Add(displayName);
                        Program.LogMessage("启动错误", $"文件不存在: {programItem.Path}");
                        lblStatus.Text = $"文件不存在:{displayName}";

                        // 等待短暂时间,让用户看到状态更新
                        await Task.Delay(500);
                    }
                }

                // 所有程序启动完成(或中途终止)
                Program.LogMessage("程序启动", "所有程序启动完成");
                lblStatus.Text = "所有程序启动完成!";

                // 如果有启动失败或文件不存在的程序,显示汇总信息
                if (failedPrograms.Count > 0 || notFoundPrograms.Count > 0)
                {
                    string summaryMessage = "";

                    if (notFoundPrograms.Count > 0)
                    {
                        summaryMessage += $"文件不存在的程序({notFoundPrograms.Count}个):\n";
                        summaryMessage += string.Join("\n", notFoundPrograms.Select(name => $"  • {name}"));
                        summaryMessage += "\n\n";
                    }

                    if (failedPrograms.Count > 0)
                    {
                        summaryMessage += $"启动失败的程序({failedPrograms.Count}个):\n";
                        summaryMessage += string.Join("\n", failedPrograms.Select(name => $"  • {name}"));
                    }

                    // 计算成功启动的程序数量
                    int successCount = _programList.Count - failedPrograms.Count - notFoundPrograms.Count;

                    if (successCount > 0)
                    {
                        string successMessage = $"\n\n成功启动 {successCount} 个程序!";
                        if (failedPrograms.Count == 0 && notFoundPrograms.Count == 0)
                        {
                            MessageBox.Show("所有程序已按顺序启动完成!" + successMessage, "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show($"{successMessage}\n\n但有部分程序存在问题:\n\n{summaryMessage}",
                                "部分程序启动完成", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        }
                    }
                    else
                    {
                        MessageBox.Show($"所有程序启动失败!\n\n{summaryMessage}",
                            "启动失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    // 所有程序都成功启动
                    MessageBox.Show("所有程序已按顺序启动完成!", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                // 异常处理:提示启动失败信息
                Program.LogMessage("启动异常", ex.Message);
                lblStatus.Text = $"启动失败:{ex.Message}";
                MessageBox.Show($"启动程序时发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                // 恢复按钮可用状态
                SetButtonsEnabled(true);
            }
        }

        /// <summary>
        /// 设置操作按钮的可用状态
        /// 用于启动程序时禁用按钮,避免并发操作
        /// </summary>
        /// <param name="isEnabled">是否可用</param>
        private void SetButtonsEnabled(bool isEnabled)
        {
            btnStart.Enabled = isEnabled;
            btnAdd.Enabled = isEnabled;
            btnDelete.Enabled = isEnabled;
            btnMoveUp.Enabled = isEnabled;
            btnMoveDown.Enabled = isEnabled;
        }
        #endregion

        #region 命令行自动执行模块
        /// <summary>
        /// 命令行自动执行入口
        /// 无需界面操作,直接按顺序启动所有程序
        /// </summary>
        /// <returns>异步任务对象</returns>
        public async Task AutoRunPrograms()
        {
            Program.LogMessage("自动执行", "开始自动执行程序列表");
            await StartProgramsAsync();
        }
        #endregion
    }
}

数据模型

namespace SequentialProgramLauncher
{
    /// <summary>
    /// 程序项模型
    /// 存储单个程序的配置信息(序号、路径、名称、备注)
    /// </summary>
    public class ProgramItem
    {
        /// <summary>
        /// 序号
        /// </summary>
        public int Order { get; set; }
        /// <summary>
        /// 路径
        /// </summary>
        public string Path { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
    }
}

添加窗口逻辑

using System;
using System.IO;
using System.Windows.Forms;

namespace SequentialProgramLauncher
{
    public partial class AddProgramForm : Form
    {
        // 对外暴露选择的程序路径和备注
        public string SelectedPath { get; private set; }
        public string InputRemark { get; private set; }

        public AddProgramForm()
        {
            InitializeComponent();
        }

        // 选择程序按钮
        private void btnBrowse_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                // 扩展筛选器:支持exe和bat文件
                ofd.Filter = "可执行文件 (*.exe;*.bat)|*.exe;*.bat|所有文件 (*.*)|*.*";
                ofd.Title = "选择要添加的程序(EXE/BAT)";
                ofd.Multiselect = false;

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    SelectedPath = ofd.FileName;
                    txtProgramPath.Text = SelectedPath;

                    // 自动填充程序名称到备注(可选,方便用户)
                    if (string.IsNullOrEmpty(txtRemark.Text))
                    {
                        txtRemark.Text = Path.GetFileNameWithoutExtension(SelectedPath);
                    }
                }
            }
        }

        // 确认按钮
        private void btnConfirm_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(SelectedPath))
            {
                MessageBox.Show("请选择程序文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            InputRemark = txtRemark.Text.Trim();
            DialogResult = DialogResult.OK;
            Close();
        }

        // 取消按钮
        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }
    }
}

UI

窗口
 namespace SequentialProgramLauncher
{
    partial class Form1
    { 
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.lvPrograms = new System.Windows.Forms.ListView();
            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
            this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
            this.panel1 = new System.Windows.Forms.Panel();
            this.btnStart = new System.Windows.Forms.Button();
            this.btnMoveDown = new System.Windows.Forms.Button();
            this.btnMoveUp = new System.Windows.Forms.Button();
            this.btnDelete = new System.Windows.Forms.Button();
            this.btnAdd = new System.Windows.Forms.Button();
            this.lblStatus = new System.Windows.Forms.Label();
            this.panel1.SuspendLayout();
            this.SuspendLayout();
            // 
            // lvPrograms
            // 
            this.lvPrograms.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
            this.columnHeader1,
            this.columnHeader2,
            this.columnHeader3});
            this.lvPrograms.Dock = System.Windows.Forms.DockStyle.Top;
            this.lvPrograms.FullRowSelect = true;
            this.lvPrograms.GridLines = true;
            this.lvPrograms.Location = new System.Drawing.Point(0, 0);
            this.lvPrograms.Name = "lvPrograms";
            this.lvPrograms.Size = new System.Drawing.Size(800, 350);
            this.lvPrograms.TabIndex = 0;
            this.lvPrograms.UseCompatibleStateImageBehavior = false;
            this.lvPrograms.View = System.Windows.Forms.View.Details;
            // 
            // columnHeader1
            // 
            this.columnHeader1.Text = "序号";
            this.columnHeader1.Width = 60;
            // 
            // columnHeader2
            // 
            this.columnHeader2.Text = "程序名称";
            this.columnHeader2.Width = 150;
            // 
            // columnHeader3
            // 
            this.columnHeader3.Text = "程序路径";
            this.columnHeader3.Width = 580;
            // 
            // panel1
            // 
            this.panel1.Controls.Add(this.btnStart);
            this.panel1.Controls.Add(this.btnMoveDown);
            this.panel1.Controls.Add(this.btnMoveUp);
            this.panel1.Controls.Add(this.btnDelete);
            this.panel1.Controls.Add(this.btnAdd);
            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.panel1.Location = new System.Drawing.Point(0, 400);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(800, 50);
            this.panel1.TabIndex = 1;
            // 
            // btnStart
            // 
            this.btnStart.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.btnStart.Location = new System.Drawing.Point(650, 10);
            this.btnStart.Name = "btnStart";
            this.btnStart.Size = new System.Drawing.Size(120, 30);
            this.btnStart.TabIndex = 4;
            this.btnStart.Text = "启动所有程序";
            this.btnStart.UseVisualStyleBackColor = true;
            this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
            // 
            // btnMoveDown
            // 
            this.btnMoveDown.Location = new System.Drawing.Point(340, 10);
            this.btnMoveDown.Name = "btnMoveDown";
            this.btnMoveDown.Size = new System.Drawing.Size(100, 30);
            this.btnMoveDown.TabIndex = 3;
            this.btnMoveDown.Text = "下移";
            this.btnMoveDown.UseVisualStyleBackColor = true;
            this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);
            // 
            // btnMoveUp
            // 
            this.btnMoveUp.Location = new System.Drawing.Point(230, 10);
            this.btnMoveUp.Name = "btnMoveUp";
            this.btnMoveUp.Size = new System.Drawing.Size(100, 30);
            this.btnMoveUp.TabIndex = 2;
            this.btnMoveUp.Text = "上移";
            this.btnMoveUp.UseVisualStyleBackColor = true;
            this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);
            // 
            // btnDelete
            // 
            this.btnDelete.Location = new System.Drawing.Point(120, 10);
            this.btnDelete.Name = "btnDelete";
            this.btnDelete.Size = new System.Drawing.Size(100, 30);
            this.btnDelete.TabIndex = 1;
            this.btnDelete.Text = "删除";
            this.btnDelete.UseVisualStyleBackColor = true;
            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
            // 
            // btnAdd
            // 
            this.btnAdd.Location = new System.Drawing.Point(10, 10);
            this.btnAdd.Name = "btnAdd";
            this.btnAdd.Size = new System.Drawing.Size(100, 30);
            this.btnAdd.TabIndex = 0;
            this.btnAdd.Text = "添加程序";
            this.btnAdd.UseVisualStyleBackColor = true;
            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
            // 
            // lblStatus
            // 
            this.lblStatus.Dock = System.Windows.Forms.DockStyle.Fill;
            this.lblStatus.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.lblStatus.ForeColor = System.Drawing.Color.Blue;
            this.lblStatus.Location = new System.Drawing.Point(0, 350);
            this.lblStatus.Name = "lblStatus";
            this.lblStatus.Size = new System.Drawing.Size(800, 50);
            this.lblStatus.TabIndex = 2;
            this.lblStatus.Text = "就绪";
            this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.lblStatus);
            this.Controls.Add(this.panel1);
            this.Controls.Add(this.lvPrograms);
            this.Name = "MainForm";
            this.Text = "顺序程序启动器";
            this.panel1.ResumeLayout(false);
            this.ResumeLayout(false);
        }

        #endregion

        private System.Windows.Forms.ListView lvPrograms;
        private System.Windows.Forms.ColumnHeader columnHeader1;
        private System.Windows.Forms.ColumnHeader columnHeader2;
        private System.Windows.Forms.ColumnHeader columnHeader3;
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Button btnAdd;
        private System.Windows.Forms.Button btnDelete;
        private System.Windows.Forms.Button btnMoveUp;
        private System.Windows.Forms.Button btnMoveDown;
        private System.Windows.Forms.Button btnStart;
        private System.Windows.Forms.Label lblStatus;
    }
}


添加的ui
 namespace SequentialProgramLauncher
{

    // 弹窗设计器代码
    partial class AddProgramForm
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.txtRemark = new System.Windows.Forms.TextBox();
            this.label2 = new System.Windows.Forms.Label();
            this.txtProgramPath = new System.Windows.Forms.TextBox();
            this.btnBrowse = new System.Windows.Forms.Button();
            this.btnConfirm = new System.Windows.Forms.Button();
            this.btnCancel = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(15, 20);
            this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(35, 12);
            this.label1.TabIndex = 0;
            this.label1.Text = "备注:";
            // 
            // txtRemark
            // 
            this.txtRemark.Location = new System.Drawing.Point(46, 18);
            this.txtRemark.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.txtRemark.Name = "txtRemark";
            this.txtRemark.Size = new System.Drawing.Size(484, 21);
            this.txtRemark.TabIndex = 1;
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(15, 52);
            this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(35, 12);
            this.label2.TabIndex = 2;
            this.label2.Text = "程序:";
            // 
            // txtProgramPath
            // 
            this.txtProgramPath.Location = new System.Drawing.Point(46, 50);
            this.txtProgramPath.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.txtProgramPath.Name = "txtProgramPath";
            this.txtProgramPath.ReadOnly = true;
            this.txtProgramPath.Size = new System.Drawing.Size(406, 21);
            this.txtProgramPath.TabIndex = 3;
            // 
            // btnBrowse
            // 
            this.btnBrowse.Location = new System.Drawing.Point(456, 49);
            this.btnBrowse.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.btnBrowse.Name = "btnBrowse";
            this.btnBrowse.Size = new System.Drawing.Size(74, 40);
            this.btnBrowse.TabIndex = 4;
            this.btnBrowse.Text = "浏览...";
            this.btnBrowse.UseVisualStyleBackColor = true;
            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
            // 
            // btnConfirm
            // 
            this.btnConfirm.Location = new System.Drawing.Point(86, 78);
            this.btnConfirm.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.btnConfirm.Name = "btnConfirm";
            this.btnConfirm.Size = new System.Drawing.Size(159, 30);
            this.btnConfirm.TabIndex = 5;
            this.btnConfirm.Text = "确认";
            this.btnConfirm.UseVisualStyleBackColor = true;
            this.btnConfirm.Click += new System.EventHandler(this.btnConfirm_Click);
            // 
            // btnCancel
            // 
            this.btnCancel.Location = new System.Drawing.Point(292, 78);
            this.btnCancel.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.btnCancel.Name = "btnCancel";
            this.btnCancel.Size = new System.Drawing.Size(160, 30);
            this.btnCancel.TabIndex = 6;
            this.btnCancel.Text = "取消";
            this.btnCancel.UseVisualStyleBackColor = true;
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
            // 
            // AddProgramForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(541, 116);
            this.Controls.Add(this.btnCancel);
            this.Controls.Add(this.btnConfirm);
            this.Controls.Add(this.btnBrowse);
            this.Controls.Add(this.txtProgramPath);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.txtRemark);
            this.Controls.Add(this.label1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "AddProgramForm";
            this.Text = "添加程序";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox txtRemark;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.TextBox txtProgramPath;
        private System.Windows.Forms.Button btnBrowse;
        private System.Windows.Forms.Button btnConfirm;
        private System.Windows.Forms.Button btnCancel;
    }


}
 
Java桌面应用EXE启动器设计与实现(含飞溅屏幕功能) 对于高级用户,可以使用C/C++编写自定义EXE启动器,以实现更高的灵活性和控制能力。以下是一个简单的自定义启动器流程图:graph TDA[启动EXE] --> B[检测系统环境]B --> C{是否找到JRE?C -->|是| D[使用系统JRE启动JVM]C -->|否| E[使用内置JRE启动JVM]D --> F[加载Java类]E --> FF --> G[调用main方法]G --> H[运行Java应用] 阅读详情

相关推荐

exe启动器.exe

exe启动器,作用很简单,存储exe启动文件的路径并且可以在cmd里面直接启动,所需条件是需要f盘,信息是存储在F盘里的,嗯,就这样,小白写的代码,界面不美观不过用起来还可以,有一天突如其来的懒,EXE文件懒得找,就写了这个。

Win10 电脑开机软件按顺序自启动的方法

1.新建txt文件 2.文件中按照这种格式:start “” “D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe”& ping localhost -n 90 其中:1,90是延迟时间 2.“D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe” 是启动软件的路径,可在快捷键-》属性中复制。如图: 按照需要顺序往下添加,只需更改路径和十时间。如下图,设置了打开三个软件 3.将txt

weixin_39875396的博客 8633

MC启动器.exe

MC启动器.exe

python编写简单的EXE启动器

exe启动器 放假到现在一直憋在家里,最近实在无聊,就下了两个游戏玩,玩的时候,因为快捷方式放桌面感觉有点麻烦,path文件下图标有太多,就想起了自己编写一个exe启动器,就像是Readon 这个虽然好用,但是我感觉自己要是可以写出来一个就好了,现在还懒得添加游戏,自己写的才有兴趣添加 我的思路很简单: 可以列出已添加的EXE文件 可以添加EXE文件,通过写入路径 可以删除已经添加的EXE文件...

哦吼的博客 3609

Java程序启动器 Java program launcher.exe

解决双击 jar 和 class文件不能直接在windows命令提示符下运行的问题,不用手动修改注册表和环境变量,把文件的打开方式设为本程序即可

最好用的安卓启动器

最好用的安卓启动器,内存小,流畅,安卓必备桌面.

打造一个你自己图标exe的Python脚本启动器

编译一个带图标的exe的Python启动器

硫酸锌01的博客 1381

万能程序启动器

万能程序启动器类似于音速启动,可以自己定义启动的EXE,BAT等可执行文件,还带有疲劳提醒功能

如何将exe文件添加到开机启动

2、打开windows的startup启动目录(针对win10以上)3、将exe的快捷方式复制到startup目录即可实现开机自启动。1、先创建exe文件的快捷方式。

雨中深巷的油纸伞 3298

L4D2通用启动器.exe

可以联机 也可以单击 它还可以快速的把求生之路启动

便携软件启动器制作程序V2.0绿色版

就是给绿色软件制作一个exe启动程序的软件,在使用时不用启动主程序,直接打开启动器就能打开软件使用了。

win设置exe程序自启动

windows系统设置exe程序开机自启动

半两八斤的博客 1784

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 374

鸣潮自动战斗工具:日常一条龙到 4C 回声挂机的全流程

手动做鸣潮日常,从登录、耗体力、领奖到收邮件,一天约 25 分钟,还得盯着点。ok-ww 是开源的鸣潮自动战斗与自动刷声骸工具,这类重复劳动交给它,全程支持后台挂机。原理只有一条链路:截屏 + 图像识别 + 通过 Windows 消息接口模拟点击与按键,不读游戏内存、不改游戏文件,行为上等同于真人按键盘。 ## 环境预检:这些设置不对齐,识别必翻车 大部分识别故障出在环境上,跑之前逐条核对:

gitblog_01098的博客 1100

告别仿真报错!手把手教你为Intel MAX10 FPGA定制IBIS模型(附Allegro Skill工具)

本文详细介绍了为Intel MAX10 FPGA定制IBIS模型的完整流程,解决信号完整性仿真中的管脚映射问题。通过Allegro Skill工具自动化处理管脚信息,优化IBIS模型关键段落,提升仿真效率和精度,适用于高速数字电路设计。

weixin_33217202的博客 322

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

EXE4J(Windows Launcher Generator)——EXE4J概述、下载以及使用

基本概念 EXE4J:exe4j is aWindows launcher generator, that is included for free when you purchase install4j. exe4j is useful if you want to create a Java launcher without an installer. EXE4J:exe4j是Wind...

无限迭代中...... 3255

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

windows开机自启动(exe +快捷方式)

通过桌面快捷方式 设置需要开机自启动程序的快捷方式,应用场景如每次开机后自动打开word日志文档。将下载的winsw.exe放在Nginx根目录,并重命名为nginx_service.exe。注册成功后,多次启动关闭测试nginx服务,并关机重启测试nginx自启动。在弹出的运行程序框中输入如下命令;选中日志文档,点击鼠标右键按钮,点击发送到->桌面快捷方式。根据系统类型下载对应的winsw.exe文件。使用WinSW注册方式。执行服务注册及启动命令。#启动nginx服务。#关闭nginx服务。

旗鼓相当的对手的博客 2545

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 412

Proteus课设原理图及报告

1. I/O 口:32 个可编程 I/O 引脚,分成 4 个并行 I/O 端口 (P0, P1, P2, P3),P0 功能段选 a、b、c、d、e、f、g、dp 使其中部分点亮,P2 功能为位选 1、2、4.按键操作分析:P3.0-设置时钟的时间,P3.1-确定更改的时钟时间,P3.2-对。时钟设置标志 0 不设置,1 设置时,2 设置分,3 设置秒。P3.0 按下的次数对应 不设置,设置时,设置分,

2303_76688805的博客 1175

批处理---如何让Windows启动后自动依序开启相应程序

很多时候都会遇到这样的情况:每次从打开电脑后开始,到正式工作或学习之间,要一直双击启动好多个程序。 解决办法1:直接设置为开机自启动,但是这样的话就拖慢了电脑开机速度。 解决办法2:批处理。(不会影响开机速度) 本文章详细介绍解决办法2: 1.在左面右键新建一个txt文档,输入这样一行命令: start "" "C:\Program Files\锐捷网络\Ruijie Supplicant\R...

匿名攻城狮 1473

基于经验模态分解和核主成分分析结合长短期记忆网络EMD-KPCA-LSTM的光伏功率预测算法--Matlab

基于经验模态分解和核主成分分析结合长短期记忆网络EMD-KPCA-LSTM的光伏功率预测算法--Matlab

前程算法屋的博客 625

掌握UEFI启动管理:EFI Boot Editor完整使用指南

你是否经常为多系统启动顺序烦恼?想要轻松管理Windows、Linux双系统却不知从何下手?EFI Boot Editor正是你需要的**UEFI启动管理**解决方案!这款专为现代计算机设计的**EFI启动工具**,让你告别复杂的BIOS设置,享受简单直观的**多系统启动管理**体验。 在UEFI取代传统BIOS的今天,启动管理变得更加复杂。无论是调整启动顺序、添加新的启动项,还是配置启动参数,

gitblog_00838的博客 185

UFS总体介绍及FPGA开发

通过实现UFS的主控制器、设备控制器等组件,我们可以在FPGA上进行UFS开发,并实现高速数据传输和低功耗特性的存储解决方案。物理层负责传输物理信号,数据链路层提供数据包的传输和错误检测功能,传输层处理数据包的分段、重组和重传,逻辑层管理设备和主控制器之间的命令和数据传输,文件系统层负责文件管理和数据存储。在本文中,我们将介绍UFS的总体架构和特性,并探讨如何在FPGA上进行UFS开发。这些组件的实现涉及到UFS协议的具体细节和硬件平台的特性,因此需要参考UFS协议规范和FPGA开发平台的相关文档。

PodProgram的博客 2135

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

我的世界服务器的启动器在哪个文件夹,原神启动器在哪 启动器位置文件介绍...

原神维护过后,电脑玩家的游戏打开都会提示需要打开启动器获取最新的游戏版本,那么原神启动器在哪,打不开游戏怎么办?下面小编给大家带来原神启动器文件位置介绍,一起看看吧。原神启动在哪启动器文件位置在当玩家把启动器快捷方式删除后,可以在回收站位置中找到并恢复就行了。如果玩家把回收站的启动器文件也清理掉了,可以在游戏的根目录中找到,如果只是把启动器删除了的话,可以在官网重新下载启动器,也就200MB的事。...

weixin_30844577的博客 7868

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: Nginx 反向代理学习:单端口统一访问多服务
下一篇: Docker+Nginx+Node.js 全栈容器化部署
先生沉默先
博客等级 码龄6年 920粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值