Windows 程序自启动实现方法详解

在 Windows 操作系统中,我们经常需要将某些程序设置为开机自启动,以便在系统启动后自动运行。这对于一些常用的应用程序来说非常方便,可以减少用户手动启动程序的时间和操作步骤。本文将详细介绍如何通过 cmd 或者 bat 文件将一个程序写入注册表,让它开机自启动。

一、了解 Windows 自启动机制

在 Windows 操作系统中,启动项分为两类:自启动项和启动服务。自启动项是指在 Windows 启动时自动启动的程序或应用程序,而启动服务则是指在 Windows 启动时自动启动的系统服务。在本文中,我们主要讨论如何实现 Windows 自启动项的功能。

二、编写自启动脚本

要实现程序自启动的功能,我们需要编写一个自启动脚本,将其添加到 Windows 注册表中。这个脚本可以是一个 cmd 或者 bat 文件,其内容应该包含以下几个步骤:

  1. 检查程序是否已经安装

在脚本中,我们需要先检查程序是否已经安装。如果程序已经安装,则不需要再次添加自启动项。

  1. 添加自启动项

如果程序没有安装自启动项,我们需要将程序的路径添加到 Windows 注册表中。具体来说,我们需要添加以下两个键值:

java 复制代码
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
java 复制代码
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

这两个键值分别对应于系统级别和用户级别的自启动项。我们可以根据实际需要选择其中一个或者同时添加。

  1. 检查程序是否添加成功

添加自启动项后,我们需要再次检查程序是否成功添加到自启动项中。如果添加失败,则需要进行错误处理。

三、脚本示例

pushdpopd是Windows命令提示符中的两个命令,它们用于在命令提示符中管理目录堆栈。

pushd命令会将当前目录推入堆栈中,并将指定的目录设置为当前目录。如果不指定路径,则pushd会将当前目录推入堆栈中,并将当前目录更改为用户的主目录。语法如下:

bash 复制代码
pushd [路径]

popd命令会从目录堆栈中删除最顶部的目录,并将当前目录更改为该目录。popd命令不需要任何参数。语法如下:

bash 复制代码
popd

这两个命令通常与cd命令一起使用,以便在不同的目录之间快速切换。例如,您可以使用pushd命令进入一个目录,然后使用cd命令在该目录中进行操作。完成后,您可以使用popd命令返回到之前的目录。

以下是一个示例脚本,用于将一个程序添加到 Windows 的自启动项中,将以下文本内容保存为 .bat 文件,例如runServer.bat

bash 复制代码
@echo off

REM 设置当前目录为 bat 文件所在的目录
cd /d %~dp0

REM 保存当前目录到栈中
pushd %CD%

REM 切换到 Redis 目录并启动
cd Redis-x64-5.0.14.1
start cmd /c redis-server.exe
popd

pushd %CD%
REM 切换到 MediaServer 目录并启动
cd camera\ZLMediaKit-master
start cmd /c MediaServer.exe
popd

pushd %CD%
REM 启动 ruoyi-admin.jar
start cmd /c "java -jar ruoyi-admin.jar"

REM 切换到 nginx 目录并启动
cd nginx-1.10.2
start cmd /c start.bat
popd

timeout /t 35 /nobreak
start http://localhost:90

REM 恢复原来的工作目录
popd

以下是一个批处理脚本stopServer.bat,它可以停止您提供的这些服务:

bash 复制代码
taskkill /IM redis-server.exe /F
taskkill /IM MediaServer.exe /F
taskkill /F /IM nginx.exe > nul
taskkill /IM java.exe /F

在这个示例脚本中,我们将程序的路径设置为 D:\Server\runServer.bat,将其添加到了当前用户的自启动项中。这段代码会检查注册表中是否已经存在名为 "My Application" 的键值对,如果不存在则将你的程序路径写入注册表中。如果添加成功,会输出 "My Application 添加成功。" 的提示信息,否则会输出 "My Application 添加失败,请检查权限。" 的提示信息。

bash 复制代码
@echo off
REM 使用 chcp 命令来更改 cmd 窗口的字符编码
chcp 65001 
setlocal EnableDelayedExpansion

set KEY_NAME=HKCU\Software\Microsoft\Windows\CurrentVersion\Run
set VALUE_NAME="My Application"
set VALUE_DATA=D:\Server\runServer.bat

REM 判断注册表项是否存在
reg query %KEY_NAME% /v %VALUE_NAME% >nul 2>&1
if %errorlevel% == 0 (
    echo %VALUE_NAME% 已存在,不需要重复添加。
) else (
    REM 将程序路径写入注册表
    reg add %KEY_NAME% /v %VALUE_NAME% /t REG_SZ /d "%VALUE_DATA%" /f
    if !errorlevel! == 0 (
        echo "!VALUE_NAME!" 添加成功。
    ) else (
        echo "!VALUE_NAME!" 添加失败,请检查权限。
    )
)

pause

这段代码是一个批处理文件(bat 文件),主要实现的功能是将一个程序写入注册表,让它开机自启动。下面是代码的详细解释:

  1. @echo off 表示关闭命令行窗口上的回显,使得在执行命令时不会在窗口上显示命令本身。

  2. chcp 65001 表示更改 cmd 窗口的字符编码为 UTF-8,以便支持中文字符。

  3. setlocal EnableDelayedExpansion 表示启用延迟环境变量扩展,即在命令行执行时才进行变量的解析。

  4. set KEY_NAME=HKCU\Software\Microsoft\Windows\CurrentVersion\Run 表示要操作的注册表项,即当前用户的启动项。

  5. set VALUE_NAME="My Application" 表示要添加的键名,即程序的名称。

  6. set VALUE_DATA=D:\Server\runServer.bat 表示要添加的键值,即程序的路径。

  7. reg query %KEY_NAME% /v %VALUE_NAME% >nul 2>&1 表示查询注册表项是否存在,如果存在则返回 0,否则返回非 0 值。

  8. if %errorlevel% == 0 表示判断上一条命令的返回值是否为 0,即判断注册表项是否存在。

  9. echo %VALUE_NAME% 已存在,不需要重复添加。 表示如果注册表项已经存在,则输出提示信息。

  10. reg add %KEY_NAME% /v %VALUE_NAME% /t REG_SZ /d "%VALUE_DATA%" /f 表示将程序路径写入注册表,其中 /v 表示键名,/t 表示键值类型,/d 表示键值数据,/f 表示强制覆盖已有的键值。

  11. if !errorlevel! == 0 表示判断上一条命令的返回值是否为 0,即判断注册表项是否添加成功。

  12. echo "!VALUE_NAME!" 添加成功。 表示如果注册表项添加成功,则输出提示信息。

  13. echo "!VALUE_NAME!" 添加失败,请检查权限。 表示如果注册表项添加失败,则输出提示信息。

  14. pause 表示暂停命令行窗口的执行,等待用户按下任意键继续。

四、删除自启动项

如果你想要删除这个注册表项,可以使用以下命令,这个命令会强制删除名为 "My Application" 的键值对,即使它不存在也不会报错。

bash 复制代码
REM 使用 chcp 命令来更改 cmd 窗口的字符编码
chcp 65001 
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v "My Application" /f
echo 删除成功
pause
相关推荐
宸津-代码粉碎机13 小时前
Spring AI企业级实战|从RAG优化到Agent多工具调度
java·大数据·人工智能·后端·python·spring
吴佳浩13 小时前
AI Infra 的真相:Go 没输,rust也不是取代
后端·rust·go
喵个咪14 小时前
实时游戏网络协议深度对比:KCP vs WebRTC vs WebSocket
后端·websocket·webrtc
普通网友14 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
QuZero14 小时前
Guava Cache Deep Dive
java·后端·算法·guava
leeyi14 小时前
SSE 实时推流 —— Token 怎么一个个蹦出来
后端·agent
leeyi14 小时前
ReAct 循环的 50 行 Go 实现,逐行拆解
后端·agent
leeyi14 小时前
HITL:让人类随时叫停 AI,并且能优雅地继续
后端·agent
用户342323237631715 小时前
采集网关的离线缓存与断点续传——当网络不可靠时,数据一条都不能丢
后端
用户9168422027415 小时前
Spring Boot application.yml 最全避坑与多环境配置
java·后端