2013-10-06 64 views
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 
     ) 
    ) 
) 

回答

3

但顯然你啓動137個dir /b回合你137 C-文件的每個的。
然後你用管道啓動一個新的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 
+0

這絕對是我期待的方法,但目前它總是需要'else'路徑,就好像我根本沒有修改.c文件一樣。這是否依賴於某個版本的Windows/cmd.exe? –

+0

@eznme不,它應該與XP,W7和W8一起工作。但是您可以在'if %%〜xI ...'之前添加'echo %%〜xI,%% I'來查看找到了什麼擴展名/文件。或者,你是否在空格,感嘆號或其他文件名中使用特殊字符? – jeb

+0

只有a-to-z和一個點。我已經添加了echo以檢查檢查的順序是否正確,事實上,順序顯示,我正在改變整個時間的main.c被列出最後,迄今爲止非常好。 –