编写bat文件实现对制定文件夹下最新版本文件进行监测运行

a450423274 2017-09-21 09:45:24
@echo off
setlocal enabledelayedexpansion
set src_dir=c:\a
set last_time=0


rem 遍历源文件夹里的文件
rem 把文件名用下划线_作为分隔符分成2个部分
rem 第2部分就是备份时间,比较其数值,数值越大则表示文件越新
rem %%~na取出文件名中的时间
for /r "%src_dir%" %%a in (*.exe) do (
for /f "tokens=2 delims=-" %%b in ("%%~na") do (
if "%%b" gtr "!last_time!" (
set last_time=%%b
set last_name=%%a)
)
)

set _task=notepad.exe
set _svr=c:windows\notepad.exe
set _des=start.bat

:checkstart
for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
if %%n==%_task% (goto checkag) else goto startsvr
)
:startsvr
echo %time%
echo ********程序开始启动********
echo 程序重新启动于 %time% ,请检查系统日志 >> restart_service.txt
echo start %_svr% > %_des%
echo exit >> %_des%
start %_des%
set/p=.<nul
for /L %%i in (1 1 10) do set /p a=.<nul&ping.exe /n 2 127.0.0.1>nul
echo .
echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
cscript //b //nologo %tmp%\delay.vbs 10000
del %_des% /Q
echo ********程序启动完成********
goto checkstart

:checkag
echo %time% 程序运行正常,10秒后继续检查..
echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
cscript //b //nologo %tmp%\delay.vbs 10000
goto checkstart


这个是代码,我现在C盘中a文件夹下,有四个notepad.exe,分别命名为notepad-1.exe,notepad-2.exe
,notepad-3.exe,notepad-4.exe,用来做测试,后期的话有一个制定文件夹,里面会有一个随着时间更新的文件,所以我想能每次保证最新版本总是在运行,如果最新版本进程死了,就把这个进程从新启动,并且自动扫描文件夹中是否有最新版本


...全文
1082 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-09-25
  • 打赏
  • 举报
回复
确保qprocess.exe可以运行
赵4老师 2017-09-21
  • 打赏
  • 举报
回复
ReadDirectoryChangesW FindFirstChangeNotification
a450423274 2017-09-21
  • 打赏
  • 举报
回复
@echo off setlocal enabledelayedexpansion set src_dir=c:\a set last_time=0 rem 遍历源文件夹里的文件 rem 把文件名用下划线_作为分隔符分成2个部分 rem 第2部分就是备份时间,比较其数值,数值越大则表示文件越新 rem %%b取出文件名中的时间 :checkstart echo 1 for /r c:\a %%a in (*.exe) do ( for /f "tokens=2 delims=-" %%b in ("%%~na") do ( if "%%b" gtr "!last_time!" ( set last_time=%%b set last_name=%%a) ) ) for /f "tokens=3 delims=\" %%c in ("%last_name%") do set last_exe=%%c set _task=%last_exe% set _svr=%last_name% set _des=start.bat echo 2 for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do ( if %%n==%_task% (goto checkag) else goto startsvr ) :startsvr echo %time% echo ********程序开始启动******** echo 程序重新启动于 %time% ,请检查系统日志 >> restart_service.txt echo start %_svr% > %_des% echo exit >> %_des% start %_des% set/p=.<nul for /L %%i in (1 1 10) do set /p a=.<nul&ping.exe /n 2 127.0.0.1>nul echo . echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs cscript //b //nologo %tmp%\delay.vbs 10000 del %_des% /Q echo ********程序启动完成******** goto checkstart :checkag echo %time% 程序运行正常,10秒后继续检查.. echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs cscript //b //nologo %tmp%\delay.vbs 10000 goto checkstart 其中错误处在这一行 for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do ( if %%n==%_task% (goto checkag) else goto startsvr 这一行没全在程序中没有执行,请问没什么,应当怎样改正
赵4老师 2017-09-21
  • 打赏
  • 举报
回复
bat中虽然可以通过比如每间隔10秒判断指定文件夹下修改日期时间最新的exe文件是哪个,并启动运行这个exe; 但bat中无法判断正运行的exe对应进程是否死了。 只能通过让exe间隔比如5秒就打开一个日志文件,写一条新日志,再关闭来保持该日志文件的日期时间为最新。 这样bat中就可以通过判断该日志文件的日期时间是否太旧而认为exe已经死了。 此时bat可以强行终止该exe对应进程并重新运行该exe 或者exe正常运行的时候,本来就会令某个文件的日期时间保持最新,或者某个tcp连接保持连接,或者某个tcp端口保持侦听状态,……

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧