我有一个前端程序(a.exe),用于管理和启动其他程序(在此示例中为b.exe)。从列表(b.exe)中选择前端(a.exe)中的项目后,便会启动。问题是前端(a.exe)保持打开状态并关闭,我必须手动退出它启动的程序(b.exe)到桌面才能这样做。
我想做的是选择其中一个项目(b.exe)后关闭前端(a.exe)。双击即可触发。
我该如何创建一个批处理文件来做到这一点?
前端程序(a.exe)具有GUI界面。
@echo off
cd "C:\Program Files\a.exe folder"
start a.exe
那又是什么?
答案 0 :(得分:1)
最好的解决方案是与a.exe
的作者联系,并要求在启动应用程序a.exe
之后作为一个单独的过程自动退出b.exe
的选项。
第二个最佳解决方案是找出b.exe
需要成功运行的环境,并使用批处理文件创建该环境并启动b.exe
。
但是,如果由于某种原因无法实现最佳的两种解决方案,那么下面的批处理文件代码会有所帮助。
@echo off
start "" /D"C:\Program Files\a.exe folder" "a.exe"
set "LoopCount=0"
:Loop
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
%SystemRoot%\System32\tasklist.exe /NH | %SystemRoot%\System32\findstr.exe /B /C:"b.exe" /C:"c.exe" /C:"d.exe" >nul
if not errorlevel 1 (
%SystemRoot%\System32\taskkill.exe /IM "a.exe"
goto EndBatch
)
%SystemRoot%\System32\tasklist.exe /NH | %SystemRoot%\System32\findstr.exe /B /C:"a.exe"
if errorlevel 1 goto EndBatch
set /A LoopCount+=1
if not %LoopCount% == 60 goto Loop
:EndBatch
set "LoopCount="
批处理文件首先以其程序文件目录设置为当前目录启动a.exe
,然后再将其作为单独的进程启动。
Windows命令处理器在启动a.exe
之后立即继续执行批处理文件,并接下来定义值为LoopCount
的环境变量0
。
在循环内部,由于Windows Vista默认情况下会使用一秒钟,因此外部命令 TIMEOUT 可用。
然后执行外部命令 TASKLIST ,以输出所有没有标题的正在运行的进程。此输出使用|
重定向到外部命令 FINDSTR ,该命令在 TASKLIST 输出的所有行的开头搜索区分大小写选项/C:
指定的字符串中的一个。对于不区分大小写的搜索,如果不知道由/I
开始的可执行文件在 TASKLIST 的列表输出中如何使用,请另外使用 FINDSTR 选项a.exe
。 / p>
FINDSTR 在找到至少一行以搜索到的字符串之一开头的行时以值0
退出,如果没有匹配项,则以值1
退出。 FINDSTR 的输出无用,因此重定向到设备 NUL 。
在找到列表中的进程之一后,将终止信号与外部命令 TASKKILL 发送给可执行文件a.exe
。 a.exe
应该在接收和处理此信号时终止。如果a.exe
忽略了该信号或它终止了,但是在终止启动的应用程序之前,也有必要另外使用 TASKKILL 选项/F
来强制实Windows操作系统杀死a.exe
进程。通常,不应使用选项/F
,因为在操作系统杀死的应用程序打开一个或多个文件进行写操作的情况下,它可能导致文件损坏。
但是,如果在一秒钟之后a.exe
所启动的进程均未运行,则批处理文件将检查a.exe
本身是否仍在运行。如果不是这种情况,批处理文件将退出。否则,它会增加环境变量LoopCount
并将其值与60
进行比较,以在等待了60秒后退出批处理文件,以免批处理文件几乎无休止地运行。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
echo /?
findstr /?
goto /?
if /?
set /?
start /?
taskkill /?
tasklist /?
timeout /?
另请参阅Microsoft关于Using command redirection operators的文章。