在 Windows 操作系统中,我们经常需要将某些程序设置为开机自启动,以便在系统启动后自动运行。这对于一些常用的应用程序来说非常方便,可以减少用户手动启动程序的时间和操作步骤。本文将详细介绍如何通过 cmd 或者 bat 文件将一个程序写入注册表,让它开机自启动。
一、了解 Windows 自启动机制
在 Windows 操作系统中,启动项分为两类:自启动项和启动服务。自启动项是指在 Windows 启动时自动启动的程序或应用程序,而启动服务则是指在 Windows 启动时自动启动的系统服务。在本文中,我们主要讨论如何实现 Windows 自启动项的功能。
二、编写自启动脚本
要实现程序自启动的功能,我们需要编写一个自启动脚本,将其添加到 Windows 注册表中。这个脚本可以是一个 cmd 或者 bat 文件,其内容应该包含以下几个步骤:
- 检查程序是否已经安装
在脚本中,我们需要先检查程序是否已经安装。如果程序已经安装,则不需要再次添加自启动项。
- 添加自启动项
如果程序没有安装自启动项,我们需要将程序的路径添加到 Windows 注册表中。具体来说,我们需要添加以下两个键值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
这两个键值分别对应于系统级别和用户级别的自启动项。我们可以根据实际需要选择其中一个或者同时添加。
- 检查程序是否添加成功
添加自启动项后,我们需要再次检查程序是否成功添加到自启动项中。如果添加失败,则需要进行错误处理。
三、脚本示例
pushd
和popd
是Windows命令提示符中的两个命令,它们用于在命令提示符中管理目录堆栈。
pushd
命令会将当前目录推入堆栈中,并将指定的目录设置为当前目录。如果不指定路径,则pushd
会将当前目录推入堆栈中,并将当前目录更改为用户的主目录。语法如下:
pushd [路径]
popd
命令会从目录堆栈中删除最顶部的目录,并将当前目录更改为该目录。popd
命令不需要任何参数。语法如下:
popd
这两个命令通常与cd
命令一起使用,以便在不同的目录之间快速切换。例如,您可以使用pushd
命令进入一个目录,然后使用cd
命令在该目录中进行操作。完成后,您可以使用popd
命令返回到之前的目录。
以下是一个示例脚本,用于将一个程序添加到 Windows 的自启动项中,将以下文本内容保存为 .bat 文件,例如runServer.bat
@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,它可以停止您提供的这些服务:
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 添加失败,请检查权限。” 的提示信息。
@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 文件),主要实现的功能是将一个程序写入注册表,让它开机自启动。下面是代码的详细解释:
@echo off
表示关闭命令行窗口上的回显,使得在执行命令时不会在窗口上显示命令本身。chcp 65001
表示更改 cmd 窗口的字符编码为 UTF-8,以便支持中文字符。setlocal EnableDelayedExpansion
表示启用延迟环境变量扩展,即在命令行执行时才进行变量的解析。set KEY_NAME=HKCU\Software\Microsoft\Windows\CurrentVersion\Run
表示要操作的注册表项,即当前用户的启动项。set VALUE_NAME="My Application"
表示要添加的键名,即程序的名称。set VALUE_DATA=D:\Server\runServer.bat
表示要添加的键值,即程序的路径。reg query %KEY_NAME% /v %VALUE_NAME% >nul 2>&1
表示查询注册表项是否存在,如果存在则返回 0,否则返回非 0 值。if %errorlevel% == 0
表示判断上一条命令的返回值是否为 0,即判断注册表项是否存在。echo %VALUE_NAME% 已存在,不需要重复添加。
表示如果注册表项已经存在,则输出提示信息。reg add %KEY_NAME% /v %VALUE_NAME% /t REG_SZ /d "%VALUE_DATA%" /f
表示将程序路径写入注册表,其中/v
表示键名,/t
表示键值类型,/d
表示键值数据,/f
表示强制覆盖已有的键值。if !errorlevel! == 0
表示判断上一条命令的返回值是否为 0,即判断注册表项是否添加成功。echo "!VALUE_NAME!" 添加成功。
表示如果注册表项添加成功,则输出提示信息。echo "!VALUE_NAME!" 添加失败,请检查权限。
表示如果注册表项添加失败,则输出提示信息。pause
表示暂停命令行窗口的执行,等待用户按下任意键继续。
四、删除自启动项
如果你想要删除这个注册表项,可以使用以下命令,这个命令会强制删除名为 “My Application” 的键值对,即使它不存在也不会报错。
REM 使用 chcp 命令来更改 cmd 窗口的字符编码 chcp 65001 reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v "My Application" /f echo 删除成功 pause