前言
虽然目前大多数成熟的Windows应用已经集成了开机启动功能,但是还有很多应用或者脚本没办法简单的做到稳定的开机自启动(首先要把任务放到开机自启动,还要保证不被某些杀毒软件吞掉或者起冲突被禁用了),如何简单实现该功能呢,那就是把它包装成系统服务,做到想停就停,想启动就启动,想延迟启动就延迟启动。今天就带来一个把可以将任何可执行文件(.exe,.bat等)包装成Windows服务的软件——WinSW。
WinSW是一个通用的Windows服务包装器,WinSW不需要安装,仅需将WinSW.exe和配置文件复制到指定目录即可。WinSW通过一个XML配置文件来定义服务的行为,可以轻松地安装,卸载,启动和停止自定义Windows服务。
WinSW的特点
-
轻量级:WinSW非常轻便,处理Windows服务所需的文件非常少,而且不需要安装任何东西,只需要将WinSW.exe和配置文件复制到指定目录即可。
-
易配置:WinSW使用XML作为配置文件格式,配置文件非常易于阅读和编辑。WinSW支持命令行参数来替代配置文件中的某些选项,从而使服务的配置更加简单。
-
灵活性:WinSW可以轻易地将几个脚本或可执行文件捆绑到一个Windows服务中。WinSW通过提供许多不同的配置选项来适应各种服务需求。
-
可扩展性:WinSW提供了丰富的扩展点来处理Windows服务的各种方面,例如日志记录和事件通知。
下载WinSW
写这篇文章时,最新版稳定版本为WinSW v2.12.0
使用
之前提到frp客户端运行需要打开cmd运行:./frpc.exe -c frpc.toml
来运行frpc,这里就以frpc作为演示将其包装为系统服务。想查看配置frp内网穿透教程可以跳转Docker配置Frp内网穿透教程
将WinSW.exe放置在需要包装的软件目录下
下载对应版本exe包之后,直接放到 frpc 的目录下,并修改名字为frpc-WinSW.exe(不修改名字也是可以的,我这里为了方便查找和管理修改这个名字)。
新建WinSW配置文件
新建文件: frpc-WinSW.xml 添加如下内容
<service>
<!-- 服务ID名称(唯一) -->
<id>frpc</id>
<!-- 服务显示名称 -->
<name>frpc</name>
<!-- 服务的描述信息 -->
<description>FRP-内网穿透客户端,帮助实现将此计算机映射到 ***.***.***.*** 上,提供公网访问</description>
<!-- 可设置环境变量 -->
<env name="HOME" value="%BASE%"/>
<!-- 要执行的可执行文件 -->
<executable>%BASE%\frpc.exe</executable>
<!-- 可执行文件传递的参数 -->
<arguments>-c .\frpc.toml</arguments>
<!-- 开机自启 -->
<startmode>Automatic</startmode>
<!-- 延时自启 -->
<delayedAutoStart/>
<!-- <logmode>rotate</logmode> -->
<logpath>%BASE%\logs</logpath>
<log mode="roll-by-size-time">
<sizeThreshold>10240</sizeThreshold>
<pattern>yyyyMMdd</pattern>
<autoRollAtTime>00:00:00</autoRollAtTime>
<zipOlderThanNumDays>5</zipOlderThanNumDays>
<zipDateFormat>yyyyMMdd</zipDateFormat>
</log>
</service>
保存最终目录效果如下:
运行
在该目录下打开cmd,以管理员身份执行
frpc-WinSW.exe install
看到如下反馈,就说明我们添加系统服务成功了。打开系统服务查看:
services.msc
就可以打开自定义配置服务了。创建服务默认是未启动的,想要立即启动点一次就行。
卸载服务
在frpc-WinSW.exe所在目录下,cmd运行如下命令即可(注意:卸载服务前如果服务在运行需要先停止服务)。
frpc-WinSW.exe uninstall
查看更多命令
可以查看官方文档
也可以运行 -h,--help,-?,/?
查看帮助信息自行食用。
WinSW使用批处理
为了大家更方便地用WinSW来使用frpc,七梦为大家写了个bat批处理。我就奔着开源的想法就不封包为exe了哈(反正也不是很难的东西),复制以下命令保存为.bat
即可食用(记得放到frpc文件夹哟)
@echo off
mode con cols=44 lines=20
title 设置frpc为系统服务by.QIMENG
color 0a
:0
cls
echo=
echo=
echo 请输入序号:
echo ============================================
echo=
echo 1.生成frpc系统服务
echo=
echo 2.启动frpc系统服务
echo=
echo 3.停止frpc系统服务
echo=
echo 4.查看frpc服务状态
echo=
echo 5.打开系统服务
echo=
echo 9.删除frpc系统服务
echo=
echo x.退出
echo=
echo ============================================
echo=
set /p num=您的选择:
echo=
if "%num%"=="1" goto 1
if "%num%"=="2" goto 2
if "%num%"=="3" goto 3
if "%num%"=="4" goto 4
if "%num%"=="5" goto 5
if "%num%"=="9" goto 9
if "%num%"=="x" goto x
echo “%num%”不是有效的选项,请输入菜单选项
pause
goto 0
:1
%~dp0/frpc-WinSW.exe install
echo 服务生成成功!!!
pause
goto 0
:2
net start frpc
echo 服务启动成功!!!
pause
goto 0
:3
net stop frpc
echo 服务停止成功!!!
pause
goto 0
:4
@echo off
for /f "skip=3 tokens=4" %%i in ('sc query frpc') do set "zt=%%i" &goto :chakan
:chakan
if /i "%zt%"=="RUNNING" (
echo frpc服务正在运行。
pause
goto 0
) else (
echo frpc服务处于停止状态。
pause
goto 0
)
:5
start services.msc
goto 0
:x
exit
:9
@echo off
for /f "skip=3 tokens=4" %%i in ('sc query frpc') do set "zt=%%i" &goto :next
:next
if /i "%zt%"=="RUNNING" (
echo 已经发现该服务在运行。
echo 准备关闭该服务。。。
net stop frpc
echo 停止frpc服务完成,请确认有没有错误发生。
pause
echo 该服务现在处于停止状态。
echo 准备删除该服务。。。
%~dp0/frpc-WinSW.exe uninstall
echo 删除frpc服务完成,请确认有没有错误发生。
) else (
echo 该服务现在处于停止状态。
echo 准备删除该服务。。。
%~dp0/frpc-WinSW.exe uninstall
echo 删除frpc服务完成,请确认有没有错误发生。
)
pause
goto 0
WinSW软件使用还是需要一点基础的,需要编辑配置文件,是否还有更简单的软件呢?那NSSM就是你的最优选,你看了我的教程我相信你很快就上手了。
拓展阅读: 使用NSSM将程序安装成Windows服务
转载请注明出处,谢谢!