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

如何在Batch中创建、访问修改灵活列表及解决时间戳输出问题

Batch脚本动态检查.cpp文件并自动编译解决方案

针对你遇到的两个核心问题(动态文件列表、时间戳格式/对比),以下是完整的解决方案:

核心思路

  • 动态遍历:通过dir命令+for循环自动获取所有.cpp文件,无需手动定义数组
  • 时间处理:将文件时间转换为统一的YYYYMMDDHHMM数字格式,解决echo输出问题,同时支持直接对比时间先后
  • 延迟扩展:启用Batch的延迟变量扩展,确保循环内变量赋值/读取正常

完整脚本

@echo off
setlocal enabledelayedexpansion

set "EXE_FILE=cppgame.exe"
set "NEED_COMPILE=0"

:: 检查目标exe是否存在,不存在则标记需要编译
if not exist "%EXE_FILE%" (
    set "NEED_COMPILE=1"
) else (
    :: 获取exe的修改时间并格式化为YYYYMMDDHHMM(24小时制)
    for %%f in ("%EXE_FILE%") do set "EXE_TIME=%%~tf"
    call :FORMAT_TIME "!EXE_TIME!" EXE_TIME_FORMATED

    :: 遍历所有.cpp文件,逐个对比时间
    for /f "delims=" %%g in ('dir /b /a-d *.cpp') do (
        for %%h in ("%%g") do set "CPP_TIME=%%~th"
        call :FORMAT_TIME "!CPP_TIME!" CPP_TIME_FORMATED

        :: 若cpp文件时间晚于exe,标记需要编译并终止检查
        if "!CPP_TIME_FORMATED!" gtr "!EXE_TIME_FORMATED!" (
            set "NEED_COMPILE=1"
            echo 发现更新的文件:%%g
            goto :END_CHECK
        )
    )
)

:END_CHECK
:: 执行编译或提示无需更新
if "!NEED_COMPILE!"=="1" (
    echo 开始重新编译...
    :: 替换为你的实际编译命令,例如:
    cl /EHsc *.cpp /Fe:%EXE_FILE%
) else (
    echo 无需编译,%EXE_FILE%已是最新版本。
)

endlocal
exit /b

:: 时间格式化子函数:输入原始时间字符串,输出YYYYMMDDHHMM格式的时间
:FORMAT_TIME
set "RAW_TIME=%~1"
set "OUTPUT_VAR=%~2"

:: 拆分日期部分(MM/DD/YYYY)
for /f "tokens=1,2,3 delims=/ " %%a in ("!RAW_TIME!") do (
    set "MM=%%a"
    set "DD=%%b"
    set "YYYY=%%c"
)

:: 拆分时间与AM/PM部分
for /f "tokens=4,5 delims= " %%a in ("!RAW_TIME!") do (
    set "TIME_PART=%%a"
    set "AMPM=%%b"
)

:: 拆分小时与分钟
for /f "tokens=1,2 delims=:" %%a in ("!TIME_PART!") do (
    set "HH=%%a"
    set "MIN=%%b"
)

:: 转换为24小时制
if /i "!AMPM!"=="PM" (
    if not "!HH!"=="12" set /a HH=!HH!+12
) else (
    if "!HH!"=="12" set HH=00
)

:: 确保小时是两位数字(如9→09)
if "!HH:~1,1!"=="" set HH=0!HH!

:: 拼接成最终格式并赋值给输出变量
set "!OUTPUT_VAR!=!YYYY!!MM!!DD!!HH!!MIN!"
exit /b

关键部分说明

  1. 动态文件遍历
    使用dir /b /a-d *.cpp获取当前目录下所有非目录的.cpp文件,配合for /f "delims=" %%g循环逐个处理,完全替代手动定义数组的方式。

  2. 时间格式化子函数
    单独提取时间处理逻辑为:FORMAT_TIME子函数,复用性更强:

    • 拆分原始时间字符串的日期、时间、AM/PM部分
    • 将12小时制转换为24小时制,保证时间对比的准确性
    • 输出统一的YYYYMMDDHHMM格式,既解决了echo输出格式问题,又能通过gtr操作符直接判断时间先后
  3. 延迟变量扩展
    启用setlocal enabledelayedexpansion后,循环内使用!变量!替代%变量%读取变量值,确保变量在循环内的实时更新能被正确读取,避免Batch变量预替换的问题。

内容的提问来源于stack exchange,提问作者Space-Coww

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:26:03