我有以下批处理文件,它使用 ADB 监视设备日志并搜索字符串:
@ECHO OFF
ECHO Starting log monitor...
START /B adb.exe logcat > log
:LOOP
(TYPE log | FIND "string to find") > NUL
IF "%errorlevel%" == "1" GOTO LOOP
:END
ECHO String found!
该脚本logcat
使用 启动命令,该命令在后台异步运行START /B
。
找到字符串后,我想结束异步logcat
命令,因为它不再需要。
主脚本有没有办法告诉异步脚本结束?
我知道从技术上讲我可以使用adb.exe kill-server
或taskkill /F /IM adb.exe
结束所有 ADB 进程,但我只需要结束命令logcat
并继续运行所有其他 ADB 实例。
答案1
@echo off
echo/ starting log monitor...
start /b adb.exe logcat >.\mylogcat.log
:loop
find "string to find" .\mylogcat.log >nul || (
>nul timeout 15 /nobreak & goto loop )
echo/ string found!
wmic process where "name like '%%adb.exe%%' and commandline like '%%logcat%%'" delete
您可以使用进程名称和用于启动该进程的命令行部分的组合来终止该进程wmic
:
wmic process where "name like '%%adb.exe%%' and commandline like '%%logcat%%'" delete
您可以使用运营商||
保持循环,并为监控循环添加超时...
:loop
find "string to find" .\mylogcat.log >nul || (
>nul timeout 15 /nobreak & goto loop )
在 PowerShell 中使用Get-WmiObject
:
Get-WmiObject Win32_Process | % { if ($_.ProcessName -like '*adb.exe*' -and $_.CommandLine -like '*mylogcat.log*') {kill $_.ProcessId}}
使用Get-CimInstance Win32_Process
:
Get-CimInstance Win32_Process -Filter "name='adb.exe'" | % { if ($_.CommandLine -like '*mylogcat.log*') {kill $_.ProcessId}}
# Or....
Get-CimInstance Win32_Process -Filter "name='adb.exe'" |
% { if ($_.CommandLine -like '*mylogcat.log*') {kill $_.ProcessId}}
其他资源: