批处理文件迭代排序对的速度很慢



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

最新更新