批处理文件迭代排序对慢

时间:2013-10-06 18:12:00

标签: batch-file

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

1 个答案:

答案 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