如何用批处理提取指定编号并依次传入现有脚本执行?
批处理自动化提取图纸编号并按规则执行复制
以下是完全基于原生批处理实现的解决方案,可自动从文本文件提取图纸编号,严格遵循先处理所有FULL SIZE/FULLSIZE行,再处理HALF SIZE行的顺序,行内编号保留原输入顺序:
完整脚本代码
@echo off setlocal enabledelayedexpansion :: -------------------------- 配置区(请根据实际情况修改) -------------------------- set "txtFile=C:\Users\Production\Desktop\图纸清单.txt" :: Word导出的文本文件路径 set "LR=LEFT" :: 图纸文件名中的LR标识(如LEFT/RIGHT) set "Lot=12345" :: 批次编号 set "input=C:\Path\To\PDF_Files" :: PDF文件所在目录 set "logFile=C:\Users\Production\Desktop\Temp\log.txt" :: 日志文件路径 :: --------------------------------------------------------------------------------- :: 初始化日志文件 echo 任务启动: %date% %time% > "%logFile%" :: 切换到PDF文件目录 cd /d "%input%" :: 第一步:处理所有标注FULL SIZE/FULLSIZE的行 echo 开始处理FULL SIZE图纸... >> "%logFile%" for /f "delims=" %%a in ('findstr /i "FULL" "%txtFile%"') do ( :: 提取"pages "之后、"("之前的编号字符串 for /f "tokens=3* delims=()" %%b in ("%%a") do ( set "pageStr=%%b" :: 将逗号替换为空格,拆分出单个编号 set "pageStr=!pageStr:,= !" :: 逐个处理每个编号 for %%s in (!pageStr!) do ( call :processSheet "%%s" ) ) ) :: 第二步:处理所有标注HALF SIZE的行 echo 开始处理HALF SIZE图纸... >> "%logFile%" for /f "delims=" %%a in ('findstr /i "HALF SIZE" "%txtFile%"') do ( for /f "tokens=3* delims=()" %%b in ("%%a") do ( set "pageStr=%%b" set "pageStr=!pageStr:,= !" for %%s in (!pageStr!) do ( call :processSheet "%%s" ) ) ) echo 任务完成: %date% %time% >> "%logFile%" endlocal exit /b :: -------------------------- 子过程:处理单个图纸编号 -------------------------- :processSheet set "sheet=%~1" :: 移除编号前后的冗余空格 for /f "tokens=*" %%t in ("%sheet%") do set "sheet=%%t" if not defined sheet goto :eof echo 正在处理图纸: %sheet% >> "%logFile%" :: 检查标准命名格式的PDF文件 if exist "*-%LR%-%sheet%.pdf" ( echo 找到文件: *-%LR%-%sheet%.pdf >> "%logFile%" for %%f in (*%LR%-%sheet%.pdf) do echo 匹配文件: %%f >> "%logFile%" goto :performCopy ) :: 检查带短横线后缀的变体格式(可根据实际文件名规则扩展) :checkdash if exist "*-%LR%-%sheet%-*.pdf" ( echo 找到带后缀的文件: *-%LR%-%sheet%-*.pdf >> "%logFile%" for %%f in (*%LR%-%sheet%-*.pdf) do echo 匹配文件: %%f >> "%logFile%" goto :performCopy ) :: 未找到文件时记录日志 echo 错误: 未找到图纸%sheet%对应的文件 >> "%logFile%" goto :eof :: 执行文件复制逻辑 :performCopy set "counter=1" :: 找到可用的计数器编号(避免覆盖已有文件) :copyLoop if exist "C:\Users\Production\Desktop\Temp\Catch\%Lot%\*!counter!_*.*" ( set /a counter+=1 goto :copyLoop ) :: 执行复制并记录结果 for %%f in (*%LR%-%sheet%.pdf) do ( xcopy /i /y "*%LR%-%sheet%.pdf" "C:\Users\Production\Desktop\Temp\Catch\%Lot%\!counter!_%%f" >> "%logFile%" 2>&1 if !errorlevel! equ 0 ( echo 成功: 已复制%%f到!counter!_%%f >> "%logFile%" ) else ( echo 错误: 复制%%f失败 >> "%logFile%" ) ) goto :eof
关键说明
- 编码要求:将Word导出的文本文件保存为ANSI编码,避免UTF-8 BOM导致批处理读取异常
- 规则适配:如果图纸文件名有其他变体(如不同分隔符、前缀),可在
:checkdash部分扩展更多if exist判断 - 变量替换:必须修改脚本开头配置区的
txtFile、LR、Lot、input为实际路径和值 - 日志记录:脚本会自动生成详细操作日志,便于排查问题
内容的提问来源于stack exchange,提问作者AnythingButThat
相关产品推荐
相关产品推荐

