2017-05-19 26 views
1
@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 

基本上,一旦这个批处理文件启动(通过运行一个程序),我想它杀死munt.exe,如果dosbox.exe终止。我尝试了各种解决方案,但我不认为我的语法正确。任何帮助表示赞赏!如何让这个批处理文件检查x进程是否正在运行,然后在x进程停止运行时kill y进程?

另外,我想让这个进程在后台运行(但不是打开的实际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有机会运行之前终止。那么,是否有办法退出批处理文件,但是如果这有意义的话继续运行它?

+0

将代码放在while循环中。如果dosbox正在运行,请再次检查。如果没有,则终止进程munt.exe并退出。 –

+0

好吧,通过阅读您所需的内容并查看代码,它看起来不合法。首先,你为什么要ping本地主机?这是延迟吗?如果是这样,而是使用'timeout/t 10'然后让我看看我是否得到这个。你想检查dosbox和mund是否都在运行,如果dosbox已经死了,那么停止mund并重启mund?或停止mund,重新启动dosbox,然后重新启动mund? –

回答

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不是,它将开始munt。

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

但最好是如果你只是创建一个VB脚本来运行隐藏的文件。

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

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

希望这是你在找什么。

相关问题