1

私は通常バッチを使用していないので、これが明らかな場合はご容赦ください。これには Make を使用したくないのですが、必要に応じて使用します。しかし、代わりにこれを修正できるかどうか見てみましょう:

フォルダ内の(のみ)137個の.cを通過し、変更日を.oと比較し、新しい場合は再コンパイルします。

内側の for ループは、新しいファイルの名前を%%I変数に入れるだけなので、2 次実行時間を持つべきではありませんが、問題は遅すぎることです。再コンパイルする必要がない場合でも、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-file ごとに 137 ラウンドを開始します。
次に、パイプを使用して新しい cmd コンテキストを開始します。

ファイル時間を比較するのは最善の方法ではないと思います。
完全なディレクトリを並べ替えることができます。その方が高速です。
最初にすべての c ファイルと o ファイルを日付順に並べ替えてからcfile_<filename>、各 c ファイルの変数 ( ) を作成します。
そして、o-file ごとに変数をクリアします。
すべてのファイルの後、関連する c ファイルを再コンパイルするために使用される残りのcfile_変数。

リダイレクト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 に答える