如何用bat写个简单的进程守护?

如何用bat写个简单的进程守护?,第1张

@echo off

set a=0

:1

tasklist | find "1.exe"&echo QQ.exe||start "1.exe"

ping -n 2 127.1 >nul

set /a a+=1

echo %a%

if %a%==120 (

goto 2

) else (

goto 1

)

:2

taskkill /f /im "1.exe"

start "1.exe"

set a=0

goto 1

根据你的最新补充,我怀疑你的问题是出在监听程序上,你是不是没有使用windows 自带的程序?

关闭和重启的语句写得过于简单了,可能在杀掉cmd的同时,有些依存服务受到了影响.

我建议改一下批处理:仅仅只是杀掉.bat的那个进程.再重新启动.bat批处理文件.建议你好好看下下面的文件.

有几个问题需要你明确一下:

你是没有采用windows 自带的:服务控制管理器来启动系统服务么?

你没有使用instsrv.exe和srvany.exe来创建自定义的windows服务么?

你的.bat有没有加入程序判断 *** 作系统的,根据不同 *** 作系统来执行?

要想作为服务启动。bat文件得符合规定的特定格式的。

你的.bat文件是否成功运行,只是并未显示DOS窗口.

希望能帮助到你.

对于1:你可以如下 *** 作

采用instsrv.exe /srvany.exe

用instsrv.exe /srvany.exe 注册windows 服务方法

1. 注册服务: x:/xxx/instsrv 服务名 x:/xxx/srvany.exe(注意得使用"/")

-------- 将srvany.exe 注册成系统服务

2. regedit打开注册表

3. 进入HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/服务名

4. 右键-新建-项 填入 Parameters

5. 打开Parameters,右键-新建-字符串值 Application

6. 双击Application 填入 应用程序的绝对路径,如: E:/jboss-4.0.5.GA/bin/starteos.bat

7. 右键-新建-字符串值AppDirectory

8. 双击AppDirectory 填入 应用程序的工作目录,如: E:/jboss-4.0.5.GA/bin

----------- 通过srvany.exe 启动注册表中定义的。exe 应用

9. 启动服务。

(注意: 7与8不可或缺)

在windows 服务管理器中看到定义的服务…

对于2:你可以采用如下 *** 作:

第一步:

下载微软系统小工具 instsrv.exe和srvany.exe至C:\Windows\System32。

第二步:

运行Dos命令代码:instsrv ServiceName C:\Windows\System32\srvany.exe

    (ServiceName 即你自己定义的服务名称,可以是要作为系统服务启动的应用程序的名称。) 

第三步:

打开注册表,定位到下面的路径。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName 

    (同样的ServiceName是你刚才安装服务时自定义的服务名称。) 

    如果该服务名下没有Parameters项目,则对服务名称项目右击新建项,名称为Parameters,然后定位到Parameters项,新建以下几个字符串值。 

    名称 Application 值为你要作为服务运行的BAT文件地址。 

    名称 AppDirectory 值为你要作为服务运行的BAT文件所在文件夹路径。 

    名称 AppParameters 值为你要作为服务运行的BAT文件启动所需要的参数。 

注:instsrv ServiceName remove 命令可删除服务。

对于3:判断WINDOWS *** 作系统

[plain]

:home

@echo off

cls

@echo  ================= 判断Windows版本 ============================

rem 选择测试三种方法

@echo [1]测试方法一

@echo [2]测试方法二

@echo [3]测试方法三

@echo [Q]结束测试

@echo ============================================================

set /p testa=选择测试方法(记得回车):

if /i %testa%==1 goto test0

if /i %testa%==2 goto test1

if /i %testa%==3 goto test2

if /i %testa%==Q goto exit

www.2cto.com

:test0

rem ================================方法一===============================

rem @echo 返回值: isXPlevel=1 XP级别isXPlevel=2 高于XP级别isXPlevel=0 低于XP级别

rem set isXPlevel=0  set isXPlevel=1 & ,set isXPlevel=2 &

ver|findstr "5\.[0-9]\.[0-9][0-9]*" >nul &&(goto show0)

ver|findstr "6\.[0-9]\.[0-9][0-9]*" >nul &&(goto show01)

goto show02

:show0

@echo ---------------- 测试方法一 ------------

@echo           当前系统是: XP级别

@echo ----------------------------------------

goto end

:show01

@echo ---------------- 测试方法一 ------------

@echo           当前系统是:高于XP级别

@echo ----------------------------------------

goto end

:show02

@echo ---------------- 测试方法一 ------------

@echo           当前系统是:低于XP级别

@echo ----------------------------------------

goto end

rem ================================方法一结束===============================

www.2cto.com

:test1

rem ================================方法二===============================

ver | find "5.0." >NUL && goto show50

ver | find "5.1." >NUL && goto show51

ver | find "5.2." >NUL && goto show52

ver | find "6.0." >NUL && goto show60

ver | find "6.1." >NUL && goto show61

:show50

@echo ---------------- 测试方法二 ------------

@echo 当前系统是:[ set XT=Windows2000  ]

@echo ----------------------------------------

goto end

:show51

@echo ---------------- 测试方法二 ------------

@echo 当前系统是:[ set XT=WindowsXP ]

@echo ----------------------------------------

goto end

:show52

@echo ---------------- 测试方法二 ------------

@echo 当前系统是:[ set XT=Windows2003 ]

@echo ----------------------------------------

goto end

:show60

@echo ---------------- 测试方法二 ------------

@echo 当前系统是:[ set XT=WindowsVista ]

@echo ----------------------------------------

goto end

:show61

@echo ---------------- 测试方法二 ------------

@echo 当前系统是:[ set XT=Windows7 ]

@echo ----------------------------------------

goto end    www.2cto.com

rem ================================方法二结束===============================

:test2

rem ================================方法三结束===============================

ver | find /i "6.1." >NUL

if %errorlevel% equ 0 (goto win7)

ver | find /i "5.1."  >NUL

if %errorlevel% equ 0 (goto winXP)

:NoneTest

@echo ---------------- 测试方法三 ------------

@echo 当前系统暂无识别数据,请直接查看系统版本:

ver

@echo ----------------------------------------

goto end

:win7

@echo ---------------- 测试方法三 ------------

@echo 当前系统是:Win7!!!

@echo ----------------------------------------

goto end

:winXP

@echo ---------------- 测试方法三 ------------

@echo 当前系统是:winXP!!!

@echo ----------------------------------------

goto end

rem ================================方法三结束===============================

www.2cto.com

:end

pause

goto Home

:exit

1.

用批处理判断 *** 作系统是32位还是64位,并注册install服务。

@echo off

if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "X86" goto 1 /////通过参数判定 *** 作系统位数,并跳转

if /i "%PROCESSOR_IDENTIFIER:~0,3%" NEQ "X86" goto 2 ///此条语句后面可以改为 EQU "EM6"

:1  /////32位xp注册install服务

%windir%\system32\msiexec.exe /regserver exit

:2  /////64位xp注册install服务

%windir%\syswow64\msiexec.exe /regserver

%windir%\system32\msiexec.exe /unreg

%windir%\system32\msiexec.exe /regserver

exit

2.用批处理判断 *** 作系统是XP还是WIN7,并执行相应的.bat文件。

建议用ver配合find来判断 系统版本,就用不着按键盘了。

@ver|find "5.1"

@if errorlevel 1 goto win7

@if errorlevel 0 goto winxp

:winXP

@call winxp.bat

@goto end

:win7

@call win7.bat

@goto end

:end

2.

Devcon实现视频设备Driver切换

@echo off

set path=%~dp0

set DevconPath=%path?vcon

::set InfPath=%path:~0,-13%st50220.inf

set InfPath=%systemroot%\inf\st50220.inf

echo InfPath=%InfPath%

echo.

::Set WinInf=%systemroot%\inf\usbvideo.inf

if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "X86" (set devcon=sndc_x86) ELSE (set devcon=sndc_x64)

cd ?vconPath%

?vcon% hwids USB\Vid_0c45* >DevInfo.bat

(for /l %%a in (1 1 1) do set /p id=)<DevInfo.bat

del DevInfo.bat

setlocal enabledelayedexpansion

set DevID=!id:~0,21!^&MI_00

echo DevID=!DevID!

echo.

::?vcon% update !WinInf! !devID!

?vcon% update !InfPath! !DevID!

echo.

endlocal

if %errorlevel% equ 0 (goto success) ELSE (goto fail)

:success

echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

echo Sonix Driver Update Success!

echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

goto end

:fail

echo ~~~~~~~~~~~~~~~~~~~~~~~~~

echo Sonix Driver Update Fail!

echo ~~~~~~~~~~~~~~~~~~~~~~~~~

goto end

:end

pause

注:这个批处理是调用Devcon工具的处理,得下载devcon工具,具体用devcon help就可以知道它的各种用途。

代码说明:

1、%~dp0当前所在路径

2、%path?vcon即path字符后面加上devcon字符串

3、path:~0,-13取取path的0至倒数第十三个字符

4、systemroot批处理自动变量。若系统装在c盘,则代表c:\windows

5、echo. 输出空白行

6、"%PROCESSOR_IDENTIFIER:~0,3%" == "X86"  判断系统是否为32位系统

7、?vcon% hwids USB\Vid_0c45* >DevInfo.bat 用deccon的hwids功能,显示包含后面字段的硬件设备,并保存到DevInfo.bat文件中.

>  文件若有,则更新替换现有内容;没有,就创建并保存内容到里面

>> 文件若有,则将新的内容添加在现有内容后面;若没有则创建,并将内容保存至里面。

8、(for /l %%a in (1 1 1) do set /p id=)<DevInfo.bat将DevInfo.bat内容的第一行赋值给id

for里面的变量注意用%%

9、set DevID=!id:~0,21!^&MI_00 将id从0开始前21个字符再加上&MI_00赋值给DevID.

因为&是特殊字符,所以要在前面加转义字符^。

10、有特殊字符的变量必须用""整个括起来,如 set "a=abc&123" echo %a%

还有一种方式就是添加

setlocal enabledelayedexpansion

endlocal

其间的变量就可以含特殊字符,但变量的使用要加!!,本示例就是用的此法。

11、::注释行

12、@取消本行的回显

13、echo on打开回显

    echo off 关闭回显


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11935753.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存