一、 Windows 启动项类

Windows启动项分为自启动程序与系统服务两大类,前者指操作系统启动时自动运行的应用程序,后者则涉及启动时激活的系统服务。本文聚焦后者的探讨。

二、脚本与命令介绍

脚本介绍

实现程序随Windows启动,需创建一个脚本(如cmd或bat文件),并编辑注册表。脚本任务包括:

  1. 验证安装状态:检查程序是否已设置自启动。
  2. 注册表修改:向注册表相应键添加程序路径以启用自启动,可选系统级、用户级或两者都设置:
    系统级:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    用户级:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

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

pushd将当前目录储存并切换到新目录;若无路径指定,则跳转到用户主目录:

pushd [路径]

popd会从目录堆栈中删除最顶部的目录,撤销上次pushd操作,返回上一目录:

popd

三、脚本示例

编写服务脚本

编写一键启动程序服务的脚本,将以下文本内容保存为 .bat 文件,例如runServer.bat

@echo off

REM 设置当前目录为 bat 文件所在的目录
REM %~dp0 是一个批处理参数扩展,表示调用此批处理文件的完整路径(包括盘符和路径)
REM /d 参数允许同时改变驱动器盘符
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,可以一键停止这些服务:

taskkill /IM redis-server.exe /F
taskkill /IM MediaServer.exe /F
taskkill /F /IM nginx.exe > nul
taskkill /IM java.exe /F

将脚本添加进自启动项中

首先检查注册表中是否有名为 “My Application” 的项,如果没有,则将路径 “D:\Server\runServer.bat” 写入用户启动项中。

@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
  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 表示暂停命令行窗口的执行,等待用户按下任意键继续。

删除自启动项

REM 使用 chcp 命令来更改 cmd 窗口的字符编码
chcp 65001 
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v "My Application" /f
echo 删除成功
pause
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐