如何实现批处理多次执行直至目标文件存在后停止指定任务
解决方案
你的核心需求是一旦目标Excel文件就绪并完全写入磁盘,执行一次notepad.exe后,后续的批处理调度直接跳过任务。以下是修改后的批处理代码及关键说明:
@echo off pushd \\172.31.100.101\dir1\dir2\ set "xxx=%CD%\dir3\dir4" set "yyy=%CD%\dir5\dir6\r2.txt" :: 检查是否已经执行过notepad,是则直接退出 IF EXIST "%yyy%" ( echo 任务已完成 > c:\r2.txt popd exit /b ) :: 查找匹配的Excel文件 set "found_file=" for /F "delims=" %%F in ('forfiles /p "%xxx%" /m Failed_Match_Data*.xlsx /s /d +0 /C "cmd /C echo @path"') do ( set "found_file=%%F" goto :file_found :: 找到第一个匹配文件就退出循环,若需处理多个可移除此行 ) :: 未找到文件时记录日志并退出 IF NOT DEFINED found_file ( echo 未找到Failed_Match_Data*.xlsx文件 > c:\Failure1.txt popd exit /b ) :file_found echo 找到目标文件:%found_file% > c:\Success1.txt :: 验证文件是否完全写入磁盘(替代固定timeout,更高效) :: 检查文件大小是否连续2秒稳定(针对20KB小文件足够) set "prev_size=0" set "stable_count=0" :wait_for_stable for %%A in ("%found_file%") do set "curr_size=%%~zA" if %curr_size% equ %prev_size% ( set /a stable_count+=1 if %stable_count% geq 2 goto :file_ready ) else ( set "prev_size=%curr_size%" set "stable_count=0" ) timeout /t 1 /nobreak >nul goto :wait_for_stable :file_ready :: 执行notepad并标记任务完成 "C:\windows\notepad.exe" echo 任务已执行 > "%yyy%" popd
关键改动说明
- 任务完成标记:保留原代码中通过
%yyy%文件判断任务是否已执行的逻辑,确保后续调度直接跳过。 - 文件检测逻辑优化:用
found_file变量记录找到的文件,避免原代码中多文件场景下IF NOT EXIST %filenames%的语法错误,找到第一个匹配文件就终止循环(若需处理多个文件,可移除goto :file_found)。 - 写入完成验证:替换固定30秒
timeout为文件大小稳定检测,针对20KB的小文件,连续2秒大小不变即可判定写入完成,既保证准确性又节省时间。 - 语法严谨性:给所有路径变量添加双引号,避免路径含空格时出错。
内容的提问来源于stack exchange,提问作者Aris
相关产品推荐
相关产品推荐

