如果x进程正在运行,如何检查此批处理文件,然后在x进程停止运行时终止y进程?

时间:2017-05-19 04:31:29

标签: batch-file vbscript

@echo off
tasklist /FI "IMAGENAME eq munt.exe" 2>NUL | find /I /N "munt.exe">NUL
if "%ERRORLEVEL%"=="0" goto :EOF
cd "Sound\VST MIDI Synth\MT-32 VST\"
start /min "" munt.exe
ping -n 2 -w 1000 127.0.0.1 >nul

基本上,一旦启动此批处理文件(通过运行程序),如果dosbox.exe终止,我希望它杀死munt.exe。我尝试了各种解决方案,但我不认为我的语法正确。任何帮助表示赞赏!

此外,我想让这个过程在后台运行(但不是实际打开的munt.exe进程)。换句话说,我想隐藏出现的CMD窗口。

编辑:根据Deepesh的建议,我现在有以下内容:

goto :Munt

:LoopStart
tasklist /FI "IMAGENAME eq dosbox.exe" 2>NUL | find /I /N "dosbox.exe">NUL
if "%ERRORLEVEL%"=="0"
goto :LoopStart
taskkill /F /IM munt.exe
goto :EOF

:Munt
@echo off
tasklist /FI "IMAGENAME eq munt.exe" 2>NUL | find /I /N "munt.exe">NUL
if "%ERRORLEVEL%"=="0" goto :LoopStart
cd "Sound\VST MIDI Synth\MT-32 VST\"
start /min "" munt.exe
ping -n 2 -w 1000 127.0.0.1 >nul
goto :LoopStart

然而,问题是启动此批处理文件的程序会等到批处理文件退出之后再启动dosbox.exe。因此批处理文件永远不会看到dosbox.exe运行并在dosbox.exe有机会运行之前终止。那么,有没有办法退出批处理文件,但是如果有意义的话,继续运行它?

2 个答案:

答案 0 :(得分:0)

所以这是交易。要不断循环并检查dosbox是否正在运行,您需要这样做。因此,如果丢弃dosbox,它将会杀死mund。

@echo off

:LoopStart
tasklist /FI "IMAGENAME eq dosbox.exe" 2>NUL | find /I /N "dosbox.exe">NULL
if %ERRORLEVEL% == 0 goto :LoopStart
taskkill /F /IM munt.exe
goto :EOF
然而,

将不间断地循环并且没有延迟。所以也许您只想每隔几秒检查一次,然后执行:

@echo off

:LoopStart
timeout /t 5
tasklist /FI "IMAGENAME eq dosbox.exe" 2>NUL | find /I /N "dosbox.exe">NULL
if %ERRORLEVEL% == 0 goto :LoopStart
taskkill /F /IM munt.exe
goto :EOF

我对第二部分不是100%肯定,你想确保mund.exe正在运行,只要dosbox正在运行吗?如果是这样,那就足够了。

@echo off
:LoopStart
tasklist /FI "IMAGENAME eq dosbox.exe" 2>NUL | find /I /N "dosbox.exe">NULL
if %ERRORLEVEL% == 0 goto :Munt
taskkill /F /IM munt.exe
goto :EOF

:Munt
tasklist /FI "IMAGENAME eq munt.exe" 2>NUL | find /I /N "munt.exe">NULL
if %ERRORLEVEL% ==  0  goto :LoopStart
cd "Sound\VST MIDI Synth\MT-32 VST\"
start /min munt.exe
timeout /t 5
goto :LoopStart
:EOF

所以更好地解释这个过程。脚本正在检查dosbox.exe,如果它运行,它将传递给:munt以检查munt是否正在运行,如果是,它返回并在循环中检查dosbox。但是如果dosbox没有运行它会杀死munt。另外,如果dosbox正在运行,但munt不运行,它将开始发声。

至于在后台运行它有两种方法。设置计划任务以最小化的形式运行批处理文件。

但最好只创建一个VB脚本来运行为您隐藏的文件。

您需要添加批处理文件路径并使用VBS扩展名保存文件。然后运行它将以隐藏模式调用批处理文件。

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\wordkingdir\mybatchfile.bat" & Chr(34), 0
Set WshShell = Nothing

希望这就是你要找的东西。

答案 1 :(得分:0)

下面是一个批处理程序,该程序创建一个vbs脚本来监视进程,然后采取措施结束该进程。

为了杀死特定进程,请使用适当的TASKKILL参数创建一个批处理文件以结束该进程,并在指示的位置插入文件路径。

插入用于监视指示位置的过程。

除了第一次启动批处理时,该批处理将保持沉默,而当Taskkill批处理启动时,该操作也将保持静默状态。 VBS将重新启动该批次,有效地更新vb以进行连续监视。 消息框将在监视过程结束时通知您-替换适合该过程的消息。

@ECHO OFF

(
ECHO Set objWMIService = GetObject ("winmgmts:"^)
ECHO Set proc = objWMIService.ExecQuery("select * from Win32_Process Where Name='Process To Moniter.exe'"^)
ECHO DO while proc.count ^> 0
ECHO Set proc = objWMIService.ExecQuery("select * from Win32_Process Where Name='Process To Moniter.exe'"^)
ECHO if proc.count ^< 1 then exit do
ECHO wscript.sleep 2000
ECHO loop
ECHO Set WshShell=createobject("wscript.shell"^)
ECHO WshShell.run "Pathway\Name of Batch File With Neseccary Taskkill.bat", 0, false
ECHO WshShell.run "%~0", 0, false
) >%TEMP%\MonitorEXE.vbs

Start %TEMP%\MonitorEXE.vbs

mshta vbscript:msgbox("Monitoring Process XYZ",0,"Notification")(window.close)

exit

这适用于许多情况,这些情况是您希望在给定过程结束时采取措施或一系列措施。 需要注意的一件事-强烈建议使用脚本中的“延迟”来减少CPU使用率。