一、最终成功办法:NSSM方法
nssm 在windows上部署服务
注册完之后,服务显示启动了,虽然看不到启动的bat脚本,但是过一会访问系统,发现系统可以访问了,看来bat是被隐式启动的,以后有什么报错信息去系统后台看就可以了。
这个问题整整搞了五天,各种方式都尝试过了,第一次最终以失败并且win+R弹不出来告终,第二次终于成功了。。
现将各种尝试方式及解决办法记录如下
1, 放在【控制面板】的【计划任务】下面
放在【计划任务】下面,如果触发器选择【登录时】是可以正常启动bat的,但是如果选择【启动时】,就无法启动,没有弹出界面,而且网站无法问,脚本确实没启动起来,推测是在启动后,有一些系统运行需要的服务如mysql没有启动好,导致bat无法启动
2,运行gpedit.msc,放在C盘【启动】文件夹下
这个方法只能在登陆后正常启动,而不能在未登录的情况下启动。
而且这个方法中间踩了一些坑
如将bat复制到【启动】文件夹下面的时候,会提示没有权限,然后右键-属性把权限配置好了以后,复制进去过一次,重启以后,再之后就提示【文件夹不能访问】无论如何重启都不能复制进去了,这个搞了一下午,即使把这个文件夹的其他访问用户都删掉了,本用户依然不能访问这个文件夹,结果下个周一重启电脑后,什么也没做,居然就很轻易的复制进去了,万分灵异。
3,使用windows自带的命令sc
使用sc create 方法创建。如:
sc create CaptureScreen binpath= F:\zwmei-project\decklink-learning\OutputBitmap\Debug\OutputBitmap.exe type= own start= auto displayname= Screen_Capture
这种方式可以在服务中看到注册的服务,同时在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services下面也可以看到相应的服务了,但是启动时会报——1053:服务没有响应的错误,推测可能原因是bat做成服务有一定的要求,并非只是简单注册一下,不是所有的bat和exe都能做成服务,需要专门的程序才行,程序里面需要有相应的代码,才会有返回值,返回告诉操作系统服务开启的情况。
还有说改ServiePipeTimeout这个参数的,错误1053:服务没有及时响应启动或控制请求
但是并没有起作用。
4,转成exe格式,做成服务并且设置成自动运行
这个可以参考windows系统将bat脚本配置为系统服务使其在开机用户登录前启动
虽然这种方法也没有成功,但这个帖子走到最后一步也踩了不少坑
其中对instsrv和srvany的解释下面的较为客观:
instsrv.exe可以创建和删除服务,然而如果没有srvany.exe的参与,创建的服务可能无法启动。那么srvany.exe做了些什么呢,启动服务后我们可以在任务管理器中找到我们的服务,然后右击服务,选择转到进程,(如果进程中没有任何项被选中,则点击下面的显示所有用户进程,然后重新选择转至进程),我们看到的是srvany.exe,而不是我们自己的exe。原来我们的exe成为了它的一个子项,由srvany.exe帮助启动。
4.1、bat转exe后,运行exe,提示找不到主类
首先bat必须是UTF-8 无BOM格式,否则打开的话会乱码,可以用notepad转一下编码
我一共有两个bat文件,其中一个转成exe运行成功了,另一个转成exe提示找不到主类,最开始怀疑是因为bat文件的命令行注释中有中文字符,由于编码问题转换失败,因此将中文全部删掉,但是依旧会报找不到主类。
而且后来即使能运行成功后,控制台都正常启动后,chrome输入网址能够加载出登录界面,但是输入账号密码后,显示连接服务台失败,因此怀疑从bat转换成exe后,还是中间转换过程出了问题,导致失败。
因此最后我自己写了两个bat, 这两个bat是引用程序所需的bat,然后转成exe,最终成功运行,这两个引导bat的代码还不太一样,最开始是复制粘贴,只写了一种,代码如下
1.引导http-startup.bat
@echo off
cd /d 引导bat所在路径
cmd /k xx.bat run %*
2.引导startup.bat(本来也想按照上述写法的,但是会报错,好像是提示找不到主类/bat不是可执行文件?记不清了)
@echo off
cd /d 引导bat所在路径
cmd /k startup.bat
然后用软件转成exe即可
4.2 、注册成服务后,可以启动,但是窗口一闪而过,无法正常持续看到窗口
这个原因是因为服务是不可以运行窗口的,因此要找到服务Interactvie Services Detection,并启动,Interactvie Services Detection服务的作用是允许服务中的窗口启动,但是即使启动后,也不是在正常桌面上,而是会弹出一个交互服务的框,点击查看,会看到自己的bat在Session 0的隔离中,运行了起来,而且这个Session 0 也只能查看,不能进行任何操作,甚至返回都不可以,只能稍后等电脑自动锁屏,再登录系统
4.3、Interactvie Services Detection服务启动报错:函数不正确
1、打开注册表
2、HKEY_LOCAL-MACHINE
SYSTEM
CurrentControlSet
Control
Windows
3、修改 NoINteractiveService 的值为 0
4、再次打开服务,然后启动就可以了。
心得:有事多google,别百度,百度了一小上午,全是废话,根本没有可用的解决方案,换成谷歌,第一条就解决了
4.4、终于把这种方式的帖子走到了最后,但是还是startup.bat会在命令窗口中会只有链接,没有正常启动,猜想会不会是自己注册的服务需要依赖如mysql的服务才能正常启动,并且和炎黄确认了炎黄平台的服务只需依赖mysql服务即可,但是添加依赖后,包括在服务中设置了如果启动失败,则重启服务等操作,依旧无法启动服务
4.5、服务还是无法启动,因此想要是否能够穿透Session 0隔离,看过一段话
从Vista开始,包括Windows7, Windows2008, Windows8等,由于‘服务隔离’(一种安全改进,即所有的服务在一个隔离的Session 0运行),服务不能直接同桌面交互。
即使你'设置为允许与桌面交互',也不能直接同桌面交互。
完毕。。踩了很多坑,但是终于搞定了。。。