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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- Windows 10 Windows ZIPファイルを解凍してフォルダ内のテキスト文書を編集して上書き保存したいのにCtr 4 2023/06/21 13:14
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
EXCEL VBA マクロ 実行する度に...
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
タッチパッドはチャタリングは...
-
メルカリのメルカードで買い物...
-
ビープ音を連続して鳴らす
-
iD
-
switch の範囲指定
-
VBA 特定の文字が入力されたセ...
-
Lispでリストの中身もすべて反...
-
リョウ・・・量?料?
-
エクセルで、日付を入力すると...
-
C# ListBoxのキーボードマッチ...
-
Excelの関数が理解できない
-
レジ返品交換について(時間がか...
-
EUCからSJISに上手く変換できない
-
蟻酸の処理について
-
Do~Loopした回数をカウントしたい
-
【ExcelVBA】外部データの更新...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
UMLでの例外処理
-
Do~Loopした回数をカウントしたい
-
VB.NET Excelを読み込んでDataT...
-
月度は何て読みますか?
-
findは動くがfindnextがマクロ...
-
リョウ・・・量?料?
-
VBA SaveChanges 上書きされない
-
iD
-
Select Case文でこのようなこと...
-
Loadイベント中にほかのイベン...
-
セルの値が0はクリアするマクロ
おすすめ情報