
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で、動作確認が取れたコードですが、
★部で、最新ファイルの取得に失敗しています。
結果、削除処理のみ期待通りに処理されサブフォルダ内の
全ファイルが削除されています。
どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。
どうかお助けください。
No.1ベストアンサー
- 回答日時:
cdに失敗しているのではないかと思います。
★部に
cd >>%L_FILE%
を入れて、ちゃんとcdできているか確認してみてください。
コード1ではcdは相対パスで行っていますが、コード2では絶対パスで行っています。
アクセス権限の問題で失敗している可能性が考えられます。
コード1で良ければ相対パスにすることで正しく動作すると思われます。
なお、元のディレクトリに戻るため、cdの代わりにpushdとpopdを使うことを勧めます。
ありがとうございます。
結論から申しますと解決しまして、お見立ての通りCDの失敗でした。
cd >>%L_FILE%にて CD前後でのカレント確認、
bat実行ユーザー(管理者権限を持つ)での実行、
サブフォルダへの移動から繰り返す処理を別ラベルに。
その上で1処理ずつ丁寧に見直しまして、
目的の動作を得ることが出来ました。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
銀行の窓口処理の件で知ってる...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
vba 空のデータをSplitする時の...
-
EXCEL VBA マクロ 実行する度に...
-
Access 日付/時間型を検...
-
EXCEL2003 VBAで2つのDBに接続...
-
Access チェックボックスでチェ...
-
FFTの結果ついて
-
月度は何て読みますか?
-
RPGプログラムの*HIVALについて
-
EagleGetというフリーソフトに...
-
急ぎです。n88basicについての...
-
OpenGLでのプログラミングにつ...
-
コンボボックスの値判定
-
UWSC
-
セックスレスの既婚女性は自慰...
-
生活保護受給者は性欲をどんな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでCOPYを繰り返すと、処理が...
-
UMLでの例外処理
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
月度は何て読みますか?
-
switch の範囲指定
-
メルカリのメルカードで買い物...
-
お家デートをしててハグを長い...
-
インタラクティブの反対語は?
-
RPGプログラムの*HIVALについて
-
DoEventsがやはり分からない
-
銀行の窓口処理の件で知ってる...
-
セックスレスの既婚女性は自慰...
-
VBの質問#if 0 then ってどう...
-
VB.NET Excelを読み込んでDataT...
-
ボタンクリックイベント 重複...
-
FFTの結果ついて
おすすめ情報