我通常不使用批次,所以如果这很明显,请原谅我。我宁愿不在这个上使用Make,但如果必须,我会的。但是,让我们来看看我们是否可以解决这个问题:
它通过(仅)137 .c在一个文件夹中比较他们的修改日期与他们的.o's并重新编译,如果更新。
内部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
)
)
)
答案 0 :(得分:3)
但显然你会为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