我通常不使用批处理,所以如果这很明显,请原谅我。我宁愿不在这个上使用 Make,但如果有必要,我会这样做。但是,让我们看一下是否可以解决此问题:
它通过文件夹中的(仅)137 .c,将其修改日期与.o进行比较,并在较新时重新编译。
内部 for 循环只是将新文件的名称获取到 %%I
变量中,因此它不应该具有二次运行时,但问题是它太慢了。即使不需要重新编译,也需要 10 秒,它只是循环和排序每对。
for %%f in (*.c) do (
For /F "Delims=" %%I In ('dir /b /OD %%~nf.o %%~nf.c ^| more +1') do (
if %%I == %%~nI.c (
REM recompile the file
) else (
REM skip it
)
)
)
但显然,你为 137 个 c 文件中的每个文件开始 137 dir /b
轮。
然后,使用管道启动新的 cmd 上下文。
我想这不是比较文件时间的最佳方式。
您可以对整个目录进行排序,这应该更快。
首先,我按日期对所有c和o文件进行排序,然后为每个c文件创建一个变量(cfile_<filename>
)。
对于每个 o 文件,我清除变量。
在所有文件之后,剩余的cfile_
变量用于重新编译相关的c文件。
重定向2>nul
只是为了避免在没有变量以 cfile_
开头的情况下出现错误消息。
@echo off
setlocal EnableDelayedExpansion
rem remove all old variables
for /F "delims=" %%a in ('set cfile_ 2^>nul') do set "%%a="
For /F "Delims=" %%I In ('dir /b /OD *.o *.c') do (
if %%~xI==.o (
set "cfile_%%~nI="
) ELSE (
set cfile_%%~nI=1
)
)
for /F "tokens=2* delims=_" %%c in ('set cfile_ 2^>nul') do echo Recompile %%c