|
|
本帖最后由 rdingding1 于 2025-6-21 19:59 编辑
问题已解决,感谢77七、aloha20200628、娃娃帮助,总结:
本脚本用于批量处理单个文件夹下的txt文档
(断点续处理,进度显示,用时统计)
方法三效率及IO读写最优(备注:dir.. | findstr.. 还有小细节待弄明白)
方法一:原findstr放入循环
方法二:采用dir.. | findstr.. + 每循环记录一次
方法三:采用dir.. | findstr.. + 每100个文件记录一次
(受限与变量长度8190,如果路径太长脚本会自动退出,按路径最长字符260,30个是保守数值)
方法三的模版如下- @echo off
- rem 使用说明:断点续处理.cmd 待处理路径 或直接拖入单个文件夹到cmd文件上
- rem 使用说明:处理txt文档
- setlocal enabledelayedexpansion
- rem ========== 配置区域 ==========
- set "input_dir=%~1"
- set "log_file=operation.log"
- set "processed_list=processed_files.txt"
- rem ========== 初始化 ==========
- if not exist "%input_dir%" (
- echo 错误:目录不存在
- echo 错误:目录不存在 >> "%log_file%"
- exit /b 1
- )
- echo 开始处理: %date% %time%
- echo 开始处理: %date% %time% > "%log_file%"
- if not exist "%processed_list%" (
- echo 记录开始 > "%processed_list%"
- )
- set t=%time%
- set crlf=^
- rem 注意上面一行,set crlf=^ 后面紧跟着一个回车,不要有其他空格
- rem ========== 主循环 ==========
- set /a count = 1
- dir /b /s /a-d "%input_dir%\*.txt" | findstr /lxivg:"%processed_list%">$.#
- for /f "delims=" %%i in ('find /v /c "" $.#') do set totalcount=%%i
- set totalcount=%totalcount:*:=%
- for /f "delims=" %%a in ($.#) do (
- set /p =!count! / %totalcount% <nul
- set /p =<nul
- set "file=%%a"
- rem 要处理的语句
- set /a abc=!count!%%100
- if !abc! equ 0 (
- set "files=!files!!crlf!!file!"
- echo !files! 已处理 >> "%log_file%"
- echo !files:\=\\!>>"%processed_list%"
- set "files="
- ) else (
- if [!files!]==[] (
- set "files=!file!"
- ) else (
- set "files=!files!!crlf!!file!"
- )
- )
- set /a count += 1
- )
- echo !files! 已处理 >> "%log_file%"
- echo !files:\=\\!>>"%processed_list%"
- del /q $.#
- :: ========== 收尾 ==========
- set t1=%time%
- if "%t1:~,2%" lss "%t:~,2%" set "add=+24"
- set /a "times=(%t1:~,2%-%t:~,2%%add%)*360000+(1%t1:~3,2%%%100-1%t:~3,2%%%100)*6000+(1%t1:~6,2%%%100-1%t:~6,2%%%100)*100+(1%t1:~-2%%%100-1%t:~-2%%%100)" ,"ss=(times/100)%%60","mm=(times/6000)%%60","hh=times/360000","ms=times%%100"
- echo 处理完成: %date% %time%
- echo 处理完成: %date% %time% >> "%log_file%"
- echo 共处理 %totalcount% 个文件,耗时 %hh%:%mm%:%ss%.%ms% 秒
- echo 操作日志已保存到: %log_file%
- pause
复制代码 方法二的模版如下- @echo off
- rem 使用说明:断点续处理.cmd 待处理路径 或直接拖入单个文件夹到cmd文件上
- rem 使用说明:处理txt文档
- setlocal enabledelayedexpansion
- rem ========== 配置区域 ==========
- set "input_dir=%~1"
- set "log_file=operation.log"
- set "processed_list=processed_files.txt"
- rem ========== 初始化 ==========
- if not exist "%input_dir%" (
- echo 错误:目录不存在
- echo 错误:目录不存在 >> "%log_file%"
- exit /b 1
- )
- echo 开始处理: %date% %time%
- echo 开始处理: %date% %time% > "%log_file%"
- if not exist "%processed_list%" (
- echo 记录开始 > "%processed_list%"
- )
- set t=%time%
- rem ========== 主循环 ==========
- set /a count = 1
- dir /b /s /a-d "%input_dir%\*.txt" | findstr /lxivg:"%processed_list%">$.#
- for /f "delims=" %%i in ('find /v /c "" $.#') do set totalcount=%%i
- set totalcount=%totalcount:*:=%
- for /f "delims=" %%a in ($.#) do (
- set /p =!count! / %totalcount% <nul
- set /p =<nul
- set "file=%%a"
- rem 要处理的语句
- set /a count += 1
- echo !file! 已处理 >> "%log_file%"
- echo !file:\=\\!>>"%processed_list%"
- )
- del /q $.#
- :: ========== 收尾 ==========
- set t1=%time%
- if "%t1:~,2%" lss "%t:~,2%" set "add=+24"
- set /a "times=(%t1:~,2%-%t:~,2%%add%)*360000+(1%t1:~3,2%%%100-1%t:~3,2%%%100)*6000+(1%t1:~6,2%%%100-1%t:~6,2%%%100)*100+(1%t1:~-2%%%100-1%t:~-2%%%100)" ,"ss=(times/100)%%60","mm=(times/6000)%%60","hh=times/360000","ms=times%%100"
- echo 处理完成: %date% %time%
- echo 处理完成: %date% %time% >> "%log_file%"
- echo 共处理 %totalcount% 个文件,耗时 %hh%:%mm%:%ss%.%ms% 秒
- echo 操作日志已保存到: %log_file%
- pause
复制代码 方法一的模版如下- @echo off
- rem 使用说明:断点续处理.cmd 待处理路径 或直接拖入单个文件夹到cmd文件上
- setlocal enabledelayedexpansion
- rem ========== 配置区域 ==========
- set "input_dir=%~1"
- set "log_file=operation.log"
- set "processed_list=processed_files.txt"
- rem ========== 初始化 ==========
- if not exist "%input_dir%" (
- echo 错误:目录不存在
- echo 错误:目录不存在 >> "%log_file%"
- exit /b 1
- )
- echo 开始处理: %date% %time%
- echo 开始处理: %date% %time% > "%log_file%"
- if not exist "%processed_list%" (
- echo 记录开始 > "%processed_list%"
- )
- set t=%time%
- rem ========== 主循环 ==========
- set /a count = 1
- for /r "%input_dir%" %%a in (*.txt) do (
- set /a count += 1
- set /p =!count! <nul
- set /p =<nul
- set "file=%%a"
- set "file_id=!file:\=\\!"
- findstr /x /c:"!file_id!" "%processed_list%" >nul
- if !errorlevel! equ 0 (
- echo 跳过 !file! 已处理 >> "%log_file%"
- ) else (
- rem 要处理的语句
- echo !file! 已处理 >> "%log_file%"
- echo !file!>> "%processed_list%"
- )
- )
- rem ========== 收尾 ==========
- set t1=%time%
- if "%t1:~,2%" lss "%t:~,2%" set "add=+24"
- set /a "times=(%t1:~,2%-%t:~,2%%add%)*360000+(1%t1:~3,2%%%100-1%t:~3,2%%%100)*6000+(1%t1:~6,2%%%100-1%t:~6,2%%%100)*100+(1%t1:~-2%%%100-1%t:~-2%%%100)" ,"ss=(times/100)%%60","mm=(times/6000)%%60","hh=times/360000","ms=times%%100"
- echo 处理完成: %date% %time%
- echo 处理完成: %date% %time% >> "%log_file%"
- echo 共处理 !count! 个文件,耗时 %hh%:%mm%:%ss%.%ms% 秒
- echo 操作日志已保存到: %log_file%
- pause
复制代码 制作总表,再按顺序执行的方式:
待编辑
后续:
以上做法不知道文件多时效率怎样,是否会有其它问题。
希望有像python那样,开始将整个记录文件读入内容,做成字典一样,IO读写少,索引速度快,实在不行该为用python来循环
======原贴内容如下====
目前要处理很多数量的文件,担心中途中断,特增加断点续处理功能。我的思路是采用processed_files.txt记录处理过的文件路径,再次运行时循环中用findstr查询是否存在记录列表中,存在则跳过。
目前脚本无法实现,本人基础较差,使用多次搜索、问Ai及试验无效,特求助,望大神指点迷津,拜谢!
操作系统:win10 64
当前执行路径为:C:\Users\rding\Downloads\大陆武侠\
路径内含文件:周郎《织心拐》.txt 等。
processed_files.txt文件内容范例如下:
“
C:\Users\rding\Downloads\大陆武侠\周郎《织心拐》.txt
C:\Users\rding\Downloads\大陆武侠\令狐庸\令狐庸(伪)《风清扬传》.txt
C:\Users\rding\Downloads\大陆武侠\令狐庸\令狐庸《剑魔独孤求败》.txt
”
有问题的脚本如下(使用时跟上处理路径 C:\Users\rding\Downloads\大陆武侠\ ,目前跟踪findstr下一句的errorlevel总是1,我将findstr echo出的内容直接执行却没有问题)- setlocal enabledelayedexpansion
- @echo off
- rem ========== 配置区域 ==========
- set "input_dir=%~1"
- set "log_file=operation.log"
- set "processed_list=processed_files.txt"
- rem ========== 初始化 ==========
- if not exist "%input_dir%" (
- echo 错误:目录不存在
- echo 错误:目录不存在 >> "%log_file%"
- exit /b 1
- )
- echo 开始处理: %date% %time%
- echo 开始处理: %date% %time% > "%log_file%"
- type nul > "%processed_list%"
- rem ========== 主循环 ==========
- for /r "%input_dir%" %%a in (*.txt) do (
- set "file=%%a"
- set "file_id=!file:\=\\!"
- findstr /x /c:"!file_id!" "%processed_list%"
- if !errorlevel! equ 0 (
- echo 跳过 !file! 已处理 >> "%log_file%"
- ) else (
- echo !file!>> "%processed_list%")
- )
- rem ========== 收尾 ==========
- echo 处理完成: %date% %time% >> "%log_file%"
- echo 操作日志已保存到: %log_file%
- pause
复制代码 上述代码我将findstr该语句直接加echo,用返回的值直接粘贴执行是没有问题的,但直接执行就是不行,百思不得其解。
另简单测试.cmd 执行没有问题,返回errorlevel是0- setlocal enabledelayedexpansion
- set "processed_list=processed_files.txt"
- set "file=C:\Users\rding\Downloads\大陆武侠\周郎《织心拐》.txt"
- set "file_id=!file:\=\\!"
- findstr /x /c:"!file_id!" "%processed_list%"
- echo !errorlevel!
- pause
复制代码 以上代码执行没有问题,errorlevel结果为0 |
评分
-
查看全部评分
|