这是我正在使用的代码。这是我在这个网站的其他帖子上找到的。
- 脚本代码 #1:
@ECHO OFF
SET EXEName=TcpSnd.exe
SET EXEFullPath=D:\ComputerRX\Pharmacy\TcpSnd.exe
SET PervasiveName=Pervasive.lnk
SET PervasiveFullPath=C:\Users\Pharmacy\Desktop\Pervasive.lnk
TASKLIST | FINDSTR /I "%EXEName%"
IF ERRORLEVEL 1 GOTO :StartPervasive
IF ERRORLEVEL 0 GOTO :EOF
:StartPervasive
START "" "%PervasiveFullPath%"
GOTO :EOF
这样做的目的是检查某个重要进程是否处于活动状态。如果进程不活动,它会启动一个具有管理员权限的快捷方式,该快捷方式指向我的软件公司提供的批处理文件。我的软件公司提供的批处理文件会关闭他们的整个套件,然后重新启动它。我基本上是使用这个进程作为替代端点来指示整个套件是否正常运行。我计划每天早上我们关门的时候运行一次。
我已经测试过了。
我只测试了第一部分,检查进程是否处于活动状态。在测试中,%PervasiveFullPath%
我没有启动,而是让它打印进程处于非活动状态。
- 测试代码 #1:
@ECHO OFF
SET EXEName=TcpSnd.exe
SET EXEFullPath=D:\ComputerRX\Pharmacy\TcpSnd.exe
TASKLIST | FINDSTR /I "%EXEName%"
IF ERRORLEVEL 1 GOTO :StartPervasive
echo TcpSnd.exe Detected...
timeout 3 >NUL
echo This window will now close.
timeout 2 >NUL
GOTO :EOF
:StartPervasive
echo TcpSnd.exe Not Detected
timeout 3 >NUL
echo This window will now close.
timeout 2 >NUL
GOTO :EOF
而且它确实有效。
然后我测试了第二部分。
- 测试代码 #2:
@ECHO OFF
SET PervasiveName=Pervasive.lnk
SET PervasivePath=C:\Users\Pharmacy\Desktop\Pervasive.lnk
:StartPervasive
echo TcpSnd.exe Not Detected
timeout 2 >NUL
echo Restarting Pervasive...
START "" "%PervasivePath%"
timeout 3 >NUL
echo Please Stand By...
timeout 7 >NUL
echo This window will now close.
timeout 2 >NUL
GOTO :EOF
而且它确实有效。
我对整个过程进行了测试并且它成功了。
我已经与软件公司确认过,他们的批次没问题,而且我的批次似乎也可以正常工作。
最后,我尝试通过从任务计划程序运行它来测试它。这就是问题开始出现的地方。
我将其设置为无论用户是否登录都运行、以最高权限运行、为 Windows 10 配置、程序/脚本下批处理文件的文件位置、允许按需运行任务、在错过计划的启动后尽快运行任务、如果任务已经在运行,则不启动新实例。
如果我关闭TcpSnd.exe
并从任务计划程序中运行任务,我的软件提供商的批处理文件会运行一半,但随后会随机停止。它会关闭整套程序,但在重新打开它们之前会停止。如果我使用我的批处理来触发它们的批处理或直接触发它们的批处理,则不会发生这种情况。
编辑1:
添加我的软件提供商的批次,但我清除了特定目标,这样我就不会意外违反许可协议中某些未知的部分。
- 软件提供商代码:
@echo off
del [background exe] /s /f
taskkill /f [/im [program in suite] repeated around 30 times]
timeout /t 5 /nobreak
net start "Pervasive.SQL (relational)"
net start "Pervasive.SQL (transactional)"
timeout /t 5 /nobreak
net start [Service name 1]
net start [Service name 2]
cd\
d:
cd computerrx\pharmacy
start primaryprogram1.exe
start primaryprogram2.exe
start primaryprogram3.exe
start primaryprogram4.exe
start primaryprogram5.exe
start primaryprogram6.exe
rem start unusedprogram1.exe
rem start unusedprogram2.exe
rem start unusedprogram3.exe
rem start unusedprogram4.exe
rem start unusedprogram5.exe
rem start unusedprogram6.exe
timeout /t 5 /nobreak
taskkill /f /im [lastprogram].exe
start [lastprogram].exe
exit
任务设置图片:
- 一般的:
- 触发器:
- 措施:
- 编辑操作:
- 状况:
- 设置:
编辑2:
我做了一些实验。我将其分为两个不同的任务。一个任务在 tspsnd.exe 进程未运行时在给定时间记录事件,另一个任务通过直接触发第二个批处理文件来查找并响应事件。它遇到了同样的问题。
对于第二个批处理文件,我还尝试让任务启动命令提示符带有一个参数启动批处理文件。遇到了同样的问题。我尝试将任务从以完全管理员权限在我的帐户下运行更改为在系统下运行,但遇到了同样的问题。我还尝试更改第二批文件夹的权限以明确包含我的用户帐户,也遇到了同样的问题。
根据我的事件查看器,延迟是位于要终止的进程列表之后和 .exe 启动之前的 net start 命令。每次我从任务计划程序运行批处理时,这些进程都无法初始化,并出现事件 7034,服务控制管理器错误。
答案1
我设法让它工作起来。 通过阅读其他帖子,我了解到 CMD 不会显示您是否选中了“无论用户是否登录都运行”,只有选中“仅在用户登录时运行”时才会显示。一旦我这样做,一切都按预期运行。
我使用的代码的最终形式是:
脚本代码 #2
@ECHO OFF
SET EXEName=TcpSnd.exe
SET EXEFullPath=D:\ComputerRX\Pharmacy\TcpSnd.exe
TASKLIST | FINDSTR /I "%EXEName%"
IF ERRORLEVEL 1 GOTO :StartPervasive
IF ERRORLEVEL 0 GOTO :EOF
:StartPervasive
eventcreate /l application /so "RxBatchLog" /t information /id 1000 /d "Pharmacy suite is not running."
GOTO :EOF
第二批操作由查找该事件日志的计划任务触发。
我让任务启动 CMD,然后使用
"/c D:\ComputerRX\Pharmacy\AppPCCServReStart"
启动软件提供商的批处理文件。
我已经将我的帐户设置为在重启时使用控制用户密码2自动登录,所以我不需要让任务强制登录。