日志分离器
核心的bat脚本语法
@echo off
setlocal enabledelayedexpansion
:: 设置控制台编码为 65001 (UTF-8)
set UCODE=65001
chcp %UCODE% >nul
:: ===================================================
:: 配置参数
set "dir_source=de_compress"
set "dir_result=de_result"
set "zip_pattern=main_log*.zip"
set "file_merged=%dir_result%\de_result1_merged.txt"
set "file_result=%dir_result%\de_result2_file.txt"
set "file_drafta=%dir_result%\de_result3_draftA.txt"
set "file_draftb=%dir_result%\de_result4_draftB.txt"
set "temp_list=file_list.tmp"
:: 筛选日志的两个关键字
set "word_one=sentry"
set "word_two=CarService"
:: ===================================================
:menu
:: 创建目标目录(若不存在)
if not exist "%dir_source%" mkdir "%dir_source%"
:: 创建目标目录(若不存在)
if not exist "%dir_result%" mkdir "%dir_result%"
title 日志筛选器
echo.
echo =============== 请选择要执行的操作 ===============
echo --------------- 1. 处理特殊文件 -----------
echo --------------- 2. 解压 zip 文件 -----------
echo --------------- 3. 合并文本文件 -----------
echo --------------- 4. 筛选关键词 -----------
echo --------------- 5. 生成草稿文本 -----------
echo --------------- 6. 退出脚本 -----------
echo.
set /p choice="请输入数字 (1-6): "
echo.
if "%choice%"=="1" goto programCalibration
if "%choice%"=="2" goto programDecompress
if "%choice%"=="3" goto programMerge
if "%choice%"=="4" goto programFilter
if "%choice%"=="5" goto programDraft
if "%choice%"=="6" goto programExit
echo 无效的输入,请重新输入
goto menu
:programCalibration
echo 文件处理任务启动...
echo -----------------------------------
:: 初始化计数器
set renamedCount=0
set zippedCount=0
set errorCount=0
:: 第一阶段:处理包含main_log但非main_log开头的非zip文件
echo 正在处理重命名任务...
for /f "delims=" %%F in ('dir /b *main_log* 2^>nul ^| findstr /i /v /b "main_log"') do (
if /i not "%%~xF"==".zip" (
set "filename=%%F"
set "newname=main_log!filename:*main_log=!"
echo [重命名] !filename! → !newname!
ren "!filename!" "!newname!" 2>nul && (
set /a renamedCount+=1
) || (
set /a errorCount+=1
echo [!] 重命名失败: !filename!
)
)
)
:: 第二阶段:压缩main_log开头且非zip的文件
echo -----------------------------------
echo 正在处理压缩任务...
for /f "delims=" %%F in ('dir /b main_log* 2^>nul ^| findstr /i /v "\.zip$"') do (
set "zipName=%%~nF.zip"
echo [压缩中] %%F → !zipName!
:: 使用Windows内置压缩功能
powershell -nologo -noprofile -command "$ErrorActionPreference='Stop';Compress-Archive -LiteralPath '%%F' -DestinationPath '!zipName!' -Force" 2>nul && (
del "%%F" 2>nul && (
set /a zippedCount+=1
) || (
set /a errorCount+=1
echo [!] 无法删除原文件: %%F
)
) || (
set /a errorCount+=1
echo [!] 压缩失败: %%F
)
)
:: 结果报告
echo -----------------------------------
echo 任务完成报告:
echo 成功重命名文件: %renamedCount%
echo 成功压缩文件 : %zippedCount%
echo 失败操作次数 : %errorCount%
echo -----------------------------------
if %errorCount% gtr 0 (
echo 注意:部分操作失败可能原因:
echo 1. 文件被占用
echo 2. 权限不足
echo 3. 文件名包含非法字符
echo 4. 磁盘空间不足
)
echo.
echo.
goto menu
:programDecompress
:: 清空目标目录(可选,避免文件覆盖冲突)
del /q "%dir_source%\*" 2>nul
:: 方法1:优先使用Windows内置tar命令(Win10 1809+)
where tar >nul 2>&1
if %errorlevel% equ 0 (
echo [使用系统tar命令解压]
for %%F in (%zip_pattern%) do (
echo 正在解压: %%F
tar -xf "%%F" -C "%dir_source%" 2>nul && (
echo ✓ 成功
) || (
echo ✗ 失败(可能文件损坏)
)
)
) else (
echo 系统未找到 tar 命令,请确保使用 Windows 10 1809 或更高版本
)
:: 结果摘要
echo.
echo --------------- 解压结果 -----------
dir /b "%dir_source%" | find /c /v "" >nul && (
for /f %%A in ('dir /b "%dir_source%" ^| find /c /v ""') do (
echo 解压文件总数: %%A
)
) || echo 没有文件被解压!
echo 文件以及解压完毕, 保存在 %dir_source% 文件夹中
echo.
echo.
goto menu
:programMerge
:: 检查源目录是否存在
if not exist "%dir_source%" (
echo 错误:源目录 "%dir_source%" 不存在
echo 请先执行选项1解压文件
pause
goto menu
)
:: 生成按名称排序的文件列表(升序)
dir /b /on "%dir_source%\*" > "%temp_list%"
:: 清空或创建输出文件
type nul > "%file_merged%"
:: 合并文件内容
set file_count=0
for /f "usebackq delims=" %%F in ("%temp_list%") do (
echo [正在合并] %%F
type "%dir_source%\%%F" >> "%file_merged%"
set /a file_count+=1
:: 添加文件分隔标记(可选)
echo. >> "%file_merged%"
echo ===== End of: %%F ===== >> "%file_merged%"
echo. >> "%file_merged%"
)
:: 清理临时文件
del "%temp_list%"
:: 获取输出文件大小
for %%F in ("%file_merged%") do set output_size=%%~zF
:: 结果报告
echo.
echo --------------- 合并完成 -----------
echo 输入文件数: %file_count%
echo 输出文件: %file_merged%
echo 文件大小: %output_size% bytes
echo.
echo.
goto menu
:programFilter
:: 检查合并文件是否存在
if not exist "%file_merged%" (
echo 错误:%file_merged% 文件不存在
echo 请先执行选项3合并文件
pause
goto menu
)
echo --------------- 准备筛选 -----------
echo 开始筛选内容, 包含有 %word_one% %word_two%
findstr /i "%word_one% %word_two%" "%file_merged%" > "%file_result%"
echo 筛选完成,结果已保存到 %file_result%
echo.
echo.
goto menu
:programDraft
echo --------------- 生成草稿文本 -----------
echo 正在生成草稿文本, 文件有 %file_drafta% 和 %file_draftb%
del "%file_drafta%" 2>nul
del "%file_draftb%" 2>nul
echo. >> "%file_drafta%"
echo. >> "%file_draftb%"
echo.
echo 草稿生成完成
echo.
echo.
goto menu
:programExit
echo --------------- 即将退出 -----------
timeout /t 2 /nobreak >nul
goto exit
:end
endlocal
运行效果

创建的文件和文件夹


