标题: [文件操作] 【已解决】求助批处理如何用adb logcat自动分段记录日志? [打印本页]
作者: 银八 时间: 6 天前 11:01 标题: 【已解决】求助批处理如何用adb logcat自动分段记录日志?
本帖最后由 银八 于 2024-11-16 23:04 编辑
Origin_MD_Data:JXU4MENDJXU2NjZGJXVGRjFBYWRiJTIwbG9nY2F0JXU2NjJGUEMldThDMDMldThCRDUldTVCODkldTUzNTMldTc2ODQldThCQjAldTVGNTUldTY1RTUldTVGRDcldTc2ODQldTU0N0QldTRFRTQldUZGMEMldTVCODMldTY3MDkldTRFMDAldTRFMkEldTcyNzkldTcwQjkldTY2MkYqKiV1NEUwMCV1NTQyRiV1NTJBOCV1NUMzMSV1NEUwRCV1NEYxQSV1NTA1QyV1NkI2MioqJXVGRjA4JXU5NjY0JXU5NzVFJTYwJTYwJTYwQ3RybCU2MCU2MCU2MCslNjAlNjAlNjBDJTYwJTYwJTYwJXVGRjBDJXU2MjE2JXU4MDA1JXU3MEI5JXU1MUZCJUQ3JTI5JXVGRjBDJXU0RjQ2JXU0RTAwJXU2QjIxJXU2MzAxJXU3RUVEJXU1OTJBJXU0RTQ1JXU3Njg0JXU2MjkzJXU1M0Q2JXU0RjFBJXU1QkZDJXU4MUY0JXU2NUU1JXU1RkQ3JXU2NTg3JXU0RUY2JXU4RkM3JXU1OTI3JXVGRjBDJXU2NUUwJXU2Q0Q1JXU3NTI4JXU4QkIwJXU0RThCJXU2NzJDJXU1NDhDTm90ZXBhZCsrJXU2MjUzJXU1RjAwJXUzMDAyJTBBJTBBJTYwJTYwJTYwYmF0Y2glMEFhZGIlMjBsb2djYXQlMjAlM0UlMjBEJTNBJTVDbG9nY2F0JTVDbG9nXyUyNXRpbWVOb3clMjUudHh0JTBBJTYwJTYwJTYwJTBBLS0tJTIwJTBBJTBBJXU3M0IwJXU1NzI4JXU2MEYzJXU3NTI4JXU0RTAwJXU0RTJBYmF0JXU1NDdEJXU0RUU0JXU1QjlFJXU3M0IwKioldTZCQ0YldTk2OTQzMCV1NTIwNiV1OTQ5RiV1NjI2NyV1ODg0QyV1NEUwMCV1NkIyMSV1NTA1QyV1NkI2MiV1NUU3NiV1NjI5MyV1NTNENiV1NjVCMCV1NjVFNSV1NUZENyoqJXU3Njg0JXU2NENEJXU0RjVDJXVGRjBDJXU1RTBDJXU2NzFCJXU1NDA0JXU0RjREJXU1OTI3JXU0RjZDJXU1RTJFJXU1RkQ5JTBB背景:adb logcat是PC调试安卓的记录日志的命令,它有一个特点是一启动就不会停止(除非Ctrl+C,或者点击×),但一次持续太久的抓取会导致日志文件过大,无法用记事本和Notepad++打开。- adb logcat > D:\logcat\log_%timeNow%.txt
复制代码
现在想用一个bat命令实现每隔30分钟执行一次停止并抓取新日志的操作,希望各位大佬帮忙
作者: flashercs 时间: 6 天前 14:00
这是AI的答案,不知道可行?- @echo off
- setlocal enabledelayedexpansion
-
- :loop
- set timestamp=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%_%time:~0,2%-%time:~3,2%-%time:~6,2%
- set log_file=logcat_%timestamp%.txt
-
- echo Starting logcat capture to %log_file%
- adb logcat -v time > "%log_file%"
- timeout /t 1800 > nul
- taskkill /F /IM adb.exe > nul
-
- echo Logcat capture stopped for %log_file%
- timeout /t 60 > nul
- goto loop
复制代码
作者: 银八 时间: 6 天前 15:32
回复 2# flashercs
执行到第9行时,会一直执行这条命令。
正如背景中介绍的,它不会自己停止,所以无法执行后续timeout指令
作者: 77七 时间: 6 天前 16:32
- @echo off
- :rec
- adb devices | findstr /rec:"device" 1>nul || (echo not connect & timeout 1 & goto :rec)
- for /f "tokens=2" %%a in ('tasklist ^| find "adb.exe"') do (
- set _pid=%%a
- )
-
- :loop
- for /f "delims=" %%a in ('wmic os get localdatetime ^| findstr [0-9]') do (
- set t=%%a
- )
- start /b cmd "/c adb logcat > D:\log_%t:~0,14%.txt"
- timeout 3
- for /f "tokens=2" %%a in ('tasklist ^| find "adb.exe" ^| find /v " %_pid% "') do (
- taskkill /f /pid %%a
- )
- goto :loop
复制代码
作者: flashercs 时间: 6 天前 17:29
本帖最后由 flashercs 于 2024-11-16 17:31 编辑
按时间不如按记录条数分割文件,如每10000条记录为一个日志:- adb logcat|powershell -c "function New-LogFileName{'D:\logcat\log_'+(Get-Date -Format 'yyyyMMddHHmmss')+'.log';}while(1){$log=New-LogFileName;$input|select -First 10000|set-content -literal $log;}"
复制代码
作者: 银八 时间: 6 天前 22:43
回复 4# 77七
感谢大佬,这个命令能够实现需要的功能了
(有两个小问题,一是在缩放cmd窗口或者按下键盘的Win键时会无视计时立即重新开始生成新日志文件
二是通过杀死adb.exe进程的方式做日志截断的话,可能影响当前其他adb命令的操作)
作者: 银八 时间: 6 天前 22:45
按时间不如按记录条数分割文件,如每10000条记录为一个日志:
flashercs 发表于 2024-11-16 17:29
原来是用powershell实现的吗,赞!
作者: 银八 时间: 6 天前 23:01
用5楼的代码润色了一下,结果:- @echo off&title 日志分割
- set lineLimit=100000
- set LogPath=F:\logcat\
- if not exist %LogPath% mkdir %LogPath%
-
- adb logcat -c&echo 历史日志已清空
- echo.&echo.
- echo 日志抓取中,保存路径为%LogPath%……
- adb logcat|powershell -c "function New-LogFileName{'%LogPath%log_'+(Get-Date -Format 'yyyyMMddHHmmss')+'.log';}while(1){$log=New-LogFileName;$input|select -First %lineLimit%|set-content -literal $log;}"
复制代码
可以使用啦
作者: 77七 时间: 5 天前 07:26
回复 6# 银八
是会存在这两个问题,为了在一个窗口中完成,采用了taskkill的方法
复制一份adb.exe 命名为 adb_2.exe,调用adb_2.exe防止影响其它adb进程
timeout /nobreak 防止误触
即使这样,还会存在一个短暂中断期间日志缺失的问题。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |