全てのフォルダから最新ファイルを残し削除
WindowsServer2008にて、
バックアップフォルダを定期的にリフレッシュ
(最新以外を削除)するバッチを作りたいです。
CやVBなど、While文、関数のある言語でのプログラム経験がありますが
バッチの方は不案内です。何卒ご教授くださいませ。
[処理内容]
C:\testdir の配下に、サブフォルダdir1,dir2,dir3が存在します。
C:\testdir にバッチファイル、「dalete.bat」を配置。
実行するのはこの「dalete.bat」になります。
サブフォルダ dir1,dir2,dir3 の中のファイルは、
「no0.zip」,「no1.zip」,「no2.zip」と、規則的な名前です。
残したいのは「no0.zip」,「no1.zip」,「no2.zip」のうち、最新のファイル1個のみです。
[コード1]
次のようなプログラムを書きました。
まずは[dir1]フォルダのみの、
最新ファイル以外を削除するプログラムです。
------------------------------------------
set L_FILE=C:\testdir\Delete.log
echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE%
REM 1フォルダ処理
cd dir1
REM 最新ファイルをリネーム保護
for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a
echo "%fname%" をリネーム保存 >> %L_FILE%
copy "%fname%" "LASTFILE.zip"
REM 他のファイルを削除
del "no*.zip" >> %L_FILE%
REM リネーム保護を戻す
ren "LASTFILE.zip" "%fname%"
echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE%
------------------------------------------
結果ログ
2013/11/29 2:17:15 処理開始
"no0.zip" をリネーム保存
2013/11/29 2:17:15 処理完了
------------------------------------------
フォルダ[dir1]の中身は"no0.zip"のみで、期待した動きです。
[コード2]
次に、[dir1],[dir2],[dir3]全てのフォルダに対し、
最新以外のファイルを削除するコードを、以下のように書きました。
------------------------------------------
set L_FILE=C:\testdir\Delete_all2.log
echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE%
REM フォルダ全てを処理
for /D %%i in (C:\testdir\*) do (
echo %%i フォルダ処理開始 >> %L_FILE%
cd %%i
REM 最新ファイルをリネーム保護(★)
for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a
echo "%fname%" をリネーム保存 >> %L_FILE%
copy "%fname%" "LASTFILE.zip"
REM 他のファイルを削除
del "no*.zip" >> %L_FILE%
REM リネーム保護を戻す
ren "LASTFILE.zip" "%fname%"
)
echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE%
------------------------------------------
結果ログ
2013/11/29 2:22:03 処理開始
C:\testdir\dir1 フォルダ処理開始
"" をリネーム保存
C:\testdir\dir2 フォルダ処理開始
"" をリネーム保存
C:\testdir\dir3 フォルダ処理開始
"" をリネーム保存
2013/11/29 2:22:03 処理完了
------------------------------------------
コード1で、動作確認が取れたコードですが、
★部で、最新ファイルの取得に失敗しています。
結果、削除処理のみ期待通りに処理されサブフォルダ内の
全ファイルが削除されています。
どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。
どうかお助けください。
お礼
ありがとうございます。このスクリプトを参考になんとかやりたいことができそうです。