1

我通常不使用批处理,所以如果这很明显,请原谅我。我不希望在这个上使用 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
        )
    )
)
4

1 回答 1

3

但很明显,您dir /b为 137 个 c 文件中的每一个开始了 137 轮。
然后你用管道启动一个新的 cmd 上下文。

我想这不是比较文件时间的最佳方法。
您可以对完整目录进行排序,这应该会更快。
首先,我按日期对所有 c 和 o 文件进行排序,然后cfile_<filename>为每个 c 文件创建一个变量 ( )。
对于每个 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
于 2013-10-06T20:09:47.913 回答