アプリ版:「スタンプのみでお礼する」機能のリリースについて

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で、動作確認が取れたコードですが、
★部で、最新ファイルの取得に失敗しています。
結果、削除処理のみ期待通りに処理されサブフォルダ内の
全ファイルが削除されています。

どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。
どうかお助けください。

A 回答 (1件)

cdに失敗しているのではないかと思います。


★部に
  cd >>%L_FILE%
を入れて、ちゃんとcdできているか確認してみてください。

コード1ではcdは相対パスで行っていますが、コード2では絶対パスで行っています。
アクセス権限の問題で失敗している可能性が考えられます。
コード1で良ければ相対パスにすることで正しく動作すると思われます。
なお、元のディレクトリに戻るため、cdの代わりにpushdとpopdを使うことを勧めます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

結論から申しますと解決しまして、お見立ての通りCDの失敗でした。

cd >>%L_FILE%にて CD前後でのカレント確認、
bat実行ユーザー(管理者権限を持つ)での実行、
サブフォルダへの移動から繰り返す処理を別ラベルに。

その上で1処理ずつ丁寧に見直しまして、
目的の動作を得ることが出来ました。
どうもありがとうございました。

お礼日時:2013/11/30 09:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!