You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现批处理多次执行直至目标文件存在后停止指定任务

解决方案

你的核心需求是一旦目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:40