2016-11-05 12 views
1

バッチスクリプトを使用して、どのようにフォルダ内の最新のファイルを削除しますか?バッチファイル最新のファイルを削除する

私が見つけたすべての結果は、最も古いファイルを削除する方法またはN日後に削除する方法のみを示しています。

リンクは、次のとおり変更日にソートして、ファイルだけで

@echo off 
set latest= 
set the_directory=your_directory 

for /F %%a in ('dir /B /OD /A-D %the_directory%') do set latest=%%a 

del %the_directory%\%latest% 

実行dirBatch file to delete files older than N daysBatch Script to delete oldest folder in a given folder

は、私はこれを行うだろうあなた

答えて

1

ありがとうございます。最後にエコーされたファイルをループして保存します。それを削除します(テストするechoによって置き換え!)次のコードスニペットは、あなたが何をしたいん

1

set "FILE=" 
pushd "\path\to\folder" || exit /B 1 
for /F "eol=| delims=" %%F in (' 
    dir /B /A:-D /O:D /T:C "*.*" 
') do (
    set "FILE=%%F" 
) 
if defined FILE del "%FILE%" 
popd 

dirコマンドが返すのみ(/A:-D)昇順(/O:D)で日付順使用したファイル作成日/T:C)、\path\to\folderにあり、パターン*.*と一致します。
for /Fループはdirによって返されたすべてのファイルを処理し、その名前を変数FILEに割り当て、各繰り返しで上書きします。したがって、最終値は最新のファイルの名前です。 delコマンドは、最後に見つかったファイルを削除します。 ifクエリは、指定された場所にファイルが見つからない場合をカバーします。マグーのcommentによって推奨されているようにここで


は、もう少しパフォーマンス前述の1以上であるかもしれない、少し修飾された変異体である:

set "FILE=" 
pushd "\path\to\folder" || exit /B 1 
for /F "eol=| delims=" %%F in (' 
    dir /B /A:-D /O:-D /T:C "*.*" 
') do (
    if not defined FILE set "FILE=%%F" 
) 
if defined FILE del "%FILE%" 
popd 

これは、それが持っているかどうかを照会することによって、変数FILEのmultiplicately上書きを回避しますすでに定義されています。ここで逆順ソート順はdirです。

しかし、Magooのanswerに示されている方法は、パフォーマンスがまだ優れています。

2
for /F %%a in ('dir /B /O-D /A-D %the_directory%') do echo("%the_directory%\%%a"&goto deldone 
:deldone 

が私のアプローチです。これは逆順でソートしたリスト(/o-d)で見つかった最初のファイル名を削除したループforから逃げ出します。

これにより、リスト全体を読み込む必要がなくなります。いくつかのファイルでこのような問題はありませんが、何千もの苦痛を伴うことがあります。

必要なDELコマンドは、テストの目的では単にECHOです。 コマンドが正しくであることを確認したら、ECHO(DELDELに変更して、実際にファイルを削除します。

+0

私はこの方法も考えましたが、パフォーマンスは確かに良いですが、別のカッコで囲まれたコードブロック内に配置されている場合にスクリプトに挿入すると問題が発生する可能性があるため、ここでは使用しないことにしました。 。 – aschipfl

+0

@aschipfl:十分ですが、制限があります。あなたの例では、 ''定義されていないファイルセット "file = %% F" 'でより良いパフォーマンスを得ることができます。 – Magoo

+0

ああ、はい、変数を照会することは、それを多重に上書きするよりも速いかもしれません、ありがとう! – aschipfl

関連する問題