web-dev-qa-db-ja.com

最新の7つのファイルをフォルダに保存するバッチファイル

誰かが私がバッチファイルを作成するのを手伝ってもらえますか?基本的に、私の目標は、最新の7 .txtファイル(つまり、最新)をフォルダーに保持し、その後残りを削除するバッチファイルを作成することです。これは、フォルダに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% 

どんな助けでも大歓迎です。

15
Knowledge42

DIRを/O-Dとともに使用して、タイムスタンプの降順でテキストファイルを一覧表示できます。 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"

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

29
dbenham

以下のバッチファイルは、より単純なアプローチを使用しています。 findstr /N "^"コマンドを使用して各ファイルに番号を付け、次に各番号を比較して最初の7つのファイルを保持し、残りを削除します。

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

アントニオ

2
Aacini

これにより、7つの最新の.txtファイルが保持され、他のすべての.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
Sarang A