我有一个.bat,它打开两个.exe:
explorer programA.exe
explorer programB.exe
让我们忘记 ProgramB.exe,专注于 A.exe
ProgramA.exe 创建了 3 个子进程,这些子进程不会在 ProgramA.exe 关闭时关闭,因此我尝试创建一个任务来终止 programA.exe 的子进程。其行为如下:
程序A,它有一个父进程名称=explorer.exe,再次执行或另一个实例程序A和父进程名称=ProgramA.exe,然后杀死第一个程序A(其中有父进程名称=explorer.exe)
我的任务触发器是这样的:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13313 and (band(Keywords,9007199254740992)) and (EventID=4689)]]
and
*[EventData[Data[@Name='ProcessName'] and (Data='C:\ProgramA.exe')]]
</Select>
</Query>
</QueryList>
当第一个实例被终止时,它将终止 ProgramA 的子进程(父进程名称=explorer.exe),但当它再次运行时,这些子进程是正常运行所必需的父进程名称=ProgramA.exe
我尝试将触发器改为:
*[EventData[Data[@Name='ProcessName'] and (Data='C:\ProgramA.exe') and (ParentProcessName='C:\ProgramA.exe')]]
但这不是正确的合成。
总结:我只想在 ParentProcessName='C:\ProgramA.exe' 的 .exe 关闭/终止/结束时运行任务
答案1
将所有内容合并到一个 .bat 文件中可能会更容易。例如:
net start <anApp Service>
"C:\Program Files\<folder>\<anApp.exe>"
net stop <anApp Service>
kill <childProccessA.exe>
kill <childProccessB.exe>
rundll32 user32.dll,MessageBeep
pause
这与我使用的代码类似:
- 启动应用程序需要的服务,但我不希望该服务持续运行。在服务启动之前,不会执行下一行。
- 运行应用程序。批处理文件的执行暂停直到应用程序退出秒。
- 然后服务停止了。
- 后服务停止,子进程终止(带有极端偏见;-)。
- 听到哔声宣布完成,并且 CMD 提示符显示暂停,以确保一切成功。
这比您的问题更复杂一些,因为其他人可能也会发现该服务和公告很有用。