2012-11-13 12 views
15

誰でもバッチファイルを作成できますか?基本的に私の目標は、最新の7つの.txtファイル(つまり、最新のファイル)をフォルダに保存し、その後は残りのファイルを削除するバッチファイルを作成することです。これは、フォルダに7つ以上のファイルがある場合です。最新のファイルを7つのフォルダに保存するバッチファイル

私が今作成している問題は、作成したバッチファイルが日付が1〜2か月間であるため、ほとんどのファイルを削除するということです。私は年齢を問わず最新の7つのファイルを常に保存したいと思っています。

だから、これは私が持っているものである -

@echo off 

setlocal enableextensions 

rem ******************************************************************************** 
rem ******************************* LOCAL VARIABLES ****************************** 
rem ******************************************************************************** 

SET TargetDirectory="C:\TEMP\test" 

SET No_of_fles_to_keep=7 

SET count=0 

set cnt=0 

rem ******************************************************************************** 

cd /d %TargetDirectory% 

REM timeout /T 500 

for %%x in (*) do set /a count+=1 

for %%A in (*.bat) do set /a cnt+=1 

cd /d %TargetDirectory% 

REM timeout /T 500 

IF %count% gtr %No_of_fles_to_keep% forfiles -p %TargetDirectory% -s -m "*.txt" -d -%No_of_fles_to_keep% -c "cmd /c del @path" 

echo %count% 

echo File count = %cnt% 

すべてのヘルプは高く評価されます。

答えて

29

/O-DでDIRを使用すると、テキストファイルを降順のタイムスタンプ順に並べることができます。 FOR/Fでは、各ファイルを繰り返し処理できます。これまでにリストされたファイルの数を記録するためにSET/Aが使用されています。今は面倒な部分が来る。

コードブロック内では、通常は同じブロック内で以前に設定された変数の値を処理するために遅延拡張を使用する必要があります。しかし、FOR変数の値に!が含まれ、ファイル名に!が含まれていると、拡張が遅延するとFORループで問題が発生する可能性があります。 7番目のファイル名が読み込まれたときに、SET/Aを使って意図的に0で割って問題を回避します。これにより、KEEP変数の定義を解除する条件コードが実行されるエラーが発生します。その時点から、残りのファイルはすべて削除されます。

@echo off 
setlocal 
set /a cnt=0 
set "keep=7" 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do (
    if defined keep (
    2>nul set /a "cnt+=1, 1/(keep-cnt)" || set "keep=" 
) else del "%%F" 
) 

更新

ああ私の良さ、私は自明な解がある実現。 FOR/F SKIPオプションを使用すると、ソート後の最初の7つのエントリを最後の変更日(降順)で無視します。

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 

バッチファイルは必要ありません。コマンドプロンプトから実行する場合は、%%から%に変更してください。

+0

の内部では、コマンドIFの "他" の部分逃した: ')他(デル "%% F")' ... – Aacini

+0

@Aaciniを - だから私はやりました、ありがとう。すべて固定されています。 – dbenham

+0

ありがとうございました!私はちょうどこれをテストし、それは魔法のように働いた。 – Knowledge42

2

以下のバッチファイルでは、より簡単な方法を使用しています。これは、すべての7つの最新の.txtファイルを保持し、削除しますアントニオ

+0

+1、あなたの答えは私に再評価を促し、さらに簡単な解決法があることを認識させました。 FOR/F SKIPオプションを使用してください - 私の修正された回答を参照してください:-) – dbenham

0

@echo off 
for /f "tokens=1* delims=:" %%a in ('dir /b /o-d *.txt ^| findstr /N "^"') do (
    if %%a gtr 7 del "%%b" 
) 

...それはちょうど最初の7つのファイルを保持し、残りを削除するには、各番号を比較し、番号に各ファイルをfindstr /N "^"コマンドを使用します。他の.txtファイル

は、ファイルコマンドプロンプトで

を削除するのと同じディレクトリにコマンドの下に実行

for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F" 

は、バッチスクリプト

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 
+0

[最善からコピー](https://stackoverflow.com/a/13368077/2152082)でも表記です。 – Stephan

関連する問題