2

ある日付(たとえば、 1-1-2010以降)。日付は、バッチファイルにハードコーディングするか、コマンドラインパラメーターとして渡すことができます。

擬似コード:

foreach file C:\Images\*.jpg modified-since 1-1-2010 do
del file

PowerShellやVBScriptなどではなく、純粋なバッチファイルを使用したいと思います。純粋なバッチ言語を使用できない場合は、小さい/無料のサードパーティのコマンドラインプログラムを使用して、変更後のファイルリストの生成を支援できます。Windows2000以降での実行をサポートする必要があります。


私が使用した最終的な解決策:

(pipitasによる回答から少し変更)

@ECHO OFF
for /f "usebackq tokens=1-7* delims=/: " %%I in (`dir/o-d/tw ^| findstr /I .jpg`) do (
  if "%%K%%I%%J %%N %%L%%M" GEQ "20100801 AM 0000" (
    del /P %%P
  )
)

いくつかの注意:/ Pを削除して、削除のたびにY/Nの確認を必要としないようにします。%文字をエスケープして、.batファイル内で機能するようにしました。^はパイプを脱出するために必要です。「usebackq」は、backticksが(リテラル文字列またはファイルを検索する代わりに)実行するコマンドを区切るようにし、tokensは解析された行を%Iで始まるように配置する変数の数を設定し、delimsは区切り文字(末尾のスペースを含む)を設定します)行をそれらのトークンに解析するために使用されます。

.jpgファイルのみを処理したかったので、findstr検索文字列として.jpgを追加しました。考えられる問題のいくつかは、ロケールが日付を異なる方法で出力し、異なる数の変数または異なる区切り文字を必要とし、ファイル名に埋め込まれた「.jpg」と誤検出が一致する可能性があることです(findstr正規表現などが必要です)。 。

Windows 2000以前をサポートする必要がない場合はforfiles、Johannesが提案したように使用すると、これがはるかに簡単になります。

4

1 に答える 1

4

最初のいくつかの予備知識:

  • dir /od /tw /s ..\path\to\somedir:すべてのディレクトリのファイル+サブディレクトリを、日付+最終変更時刻でソートして一覧表示します。
  • dir /o-d /tw /s ..\path\to\somedir:同じですが、逆の順序です(最後から古いもの)。

次に、既存のパスのローカル例を使用します。さあ行こう:

dir /tc /o-d /s gstmp\*yell*.tif ^| findstr 2010
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: D479-1658

 Verzeichnis von C:\downloads\gstmp

08/06/2010  05:01 PM           19 compression-g4-emptypage-tiffsep1(Yellow).tif
08/06/2010  05:00 PM           19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08/06/2010  04:57 PM           19 compression-g3-tiffsep1(Yellow).tif
08/06/2010  04:57 PM           19 compression-crle-tiffsep1(Yellow).tif
08/06/2010  04:56 PM           19 compression-pack-share-tiffsep1(Yellow).tif
08/06/2010  04:53 PM           19 compression-g4-share-tiffsep1(Yellow).tif
08/06/2010  04:52 PM           19 compression-lzw-share-tiffsep1(Yellow).tif
08/06/2010  04:51 PM           19 compression-default-share-tiffsep1(Yellow).tif
08/06/2010  03:59 PM           19 compression-none-share-tiffsep.Yellow.tif
08/06/2010  03:55 PM           19 share-tiffsep.Yellow.tif
              10 Datei(en)       190 Bytes

現時点では、追加のヘッダーと要約情報は気に入らない。何かをフィルタリングすることで、これを取り除くことができます。単に「2010」を使用します。

しかし、今、本当の問題が始まります。作成日時は、「ロケール」に応じて、異なる形式で印刷される可能性があります。あなたはそれが現在私をどのように探しているか、あなた自身を見ることができます。

番号順に正確に一致する形式で日付を表示できれば、うまくいきませんか?次に、単純な数値比較によって削除を決定するロジックを実装できます。試してみましょう(これが私にとってうまくいく場合、必ずしもあなたのために働くとは限りません-あなたはあなたのロケールに採用する必要があるかもしれません)。私が使用している「バッククォート」( "``")と^記号に注意してください。

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
   ^| findstr 2010`) do echo.    %I %J %K %L %M %N %O %P

ここに出力:

08 06 2010 05 01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif
08 06 2010 05 00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-g3-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-crle-tiffsep1(Yellow).tif
08 06 2010 04 56 PM 19 compression-pack-share-tiffsep1(Yellow).tif
08 06 2010 04 53 PM 19 compression-g4-share-tiffsep1(Yellow).tif
08 06 2010 04 52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif
08 06 2010 04 51 PM 19 compression-default-share-tiffsep1(Yellow).tif
08 06 2010 03 59 PM 19 compression-none-share-tiffsep.Yellow.tif
08 06 2010 03 55 PM 19 share-tiffsep.Yellow.tif

私たちはもうすぐそこにいますが、まだ完全ではありません。トークンの順序をに変更して、日付がの代わりに表示されるようにする必要%I %J %K%K %I %Jあり2010 08 06ます08 06 2010。また、スペースなしで適切なトークンを作成する場合は、日付と時刻の文字列を取得して、簡単に比較できるようにします。さらに、楽しみのために、をスキップ%Oして矢印に置き換えます。

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
   ^| findstr 2010`) do echo.    %K%I%J%L%M%N ==^> %P

出力が次のように変更されます。

201008060501PM ==> compression-g4-emptypage-tiffsep1(Yellow).tif
201008060500PM ==> compression-lzw-emptypage-tiffsep1(Yellow).tif
201008060457PM ==> compression-g3-tiffsep1(Yellow).tif
201008060457PM ==> compression-crle-tiffsep1(Yellow).tif
201008060456PM ==> compression-pack-share-tiffsep1(Yellow).tif
201008060453PM ==> compression-g4-share-tiffsep1(Yellow).tif
201008060452PM ==> compression-lzw-share-tiffsep1(Yellow).tif
201008060451PM ==> compression-default-share-tiffsep1(Yellow).tif
201008060359PM ==> compression-none-share-tiffsep.Yellow.tif
201008060355PM ==> share-tiffsep.Yellow.tif

これで、最初のフィールドを比較する準備がほぼ整いました。

しかし、これを考慮してください:私は12時間のサイクルで私の時間を取得AMPMます。したがって、数値で比較するには、PMとAMをそれぞれ数値に置き換えて、との変換が正しい方法で数値でソートされるようにする必要が04:51 AMあります。04:50 PM

さて、これはどうですか?

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
     ^| findstr 2010`) do  (
        if "%K%I%J %N %L%M" GEQ "20100806 PM 0457"  (
            echo.   [ %K-%I-%J %L:%M %N    %P. ]
        )
 )

これにより、削除する必要のあるすべてのファイルが一覧表示され、それぞれの日付も表示されます。実際に削除するには、最後echo. ... %P.を。に置き換える必要がありdel/p/f/s %Pます。

于 2010-08-13T22:23:22.483 に答える