- 締切済み
バッチコマンドでファイル名の一部を参照して削除
Windows7を使用しています。 バッチコマンドで、C:\新規フォルダ\LOGに作成された“LOG_YYYYMMDD”と言うテキストファイルを30日前を残して全て削除したいと思っています。 その他ファイルやフォルダが混在する可能性があるので”LOG_”がついたフォルダを対象として削除したいのですが、どのようにすれば良いでしょうか? パターンを考えてみましたが、どちらも足りない部分があるようで上手くいきません。 (1)for /r C:\新規フォルダ\LOG %%D in (LOG_*.txt) do if "%%D" LSS "%ANS%" del /s /q %%D ※(1)のifの"%%D"のままではダメなのは分かるのですが、どのようにしたら良いのか困っています。 (2)for /r C:\新規フォルダ\LOG %%D in (LOG_*.txt) do ( set DELDATE=%%D if "%DELDATE%" LSS "%ANS%" del /s DELDATE ) 簡単な解説もいただけると助かります。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 回答したのは、書いたとおり、 >LOG*.txtというファイル名の、最新30個を残してそれ以外を消す の場合です。 補則に書かれているサンプルファイルを見ると、ファイルが30個もないので、何も削除されないのが正常です。 上に書いた条件じゃ無くて、 「LOG*.txtというファイル名に含まれる8桁の数字を、年月日とみなして、それが現在の日付より30日以上前であれば削除」 ということですかね?毎日1つずつファイルが作られるので無ければ、「最新30個」というわけには行かないので、30日前の日付を求めないといけませんが、すこし変更して、 「LOG*.txtというファイル名に含まれる8桁の数字を、年月日とみなして、それが前月同日の日付より前であれば削除」 ということであれば、大の月小の月やうるう年など考えなくていいので楽です。 (正確な30日前の日付を求めるのは面倒) set YYYY=%DATE:~0,4% set MM=%DATE:~5,2% set DD=%DATE:~8,2% set /a MM=1%MM%-1 if %MM%==100 set /a MM=12, YYYY-=1 set FILE=LOG_%YYYY%%MM:~-2%%DD% ← これで前月同日のファイル名ができた cd /d C:\新規フォルダ\LOG for %%A in (LOG_*.txt) do if %%A lss %FILE% del %%A
- maesen
- ベストアンサー率81% (646/790)
横からで申し訳ありませんが、 >実行してみたのですが上手く削除されないようです。 >このコマンドはファイルの作成日時でみているのでしょうか? dir /b /o-d の/oオプションの働きをヘルプで確認して下さい。 dは日付順(更新日付)なので、質問者さんがやりたいことは名前順になると思いますので dir /b /o-n になると思います。 あと(2)ですが、うまくいかない原因の一つに遅延展開があるように思います。 for文の中で set DELDATE=%%D で環境変数に代入していますが、バッチでは環境変数の遅延展開というものがあって、この場合 %DELDATE% で参照した値は繰り返しの中で変化してくれません。 %DELDATE% を !DELDATE! にする必要があります。 遅延展開はデフォルトでは無効になっているので先に有効にする必要があります。 setlocal enabledelayedexpansion 詳しくは、「環境変数 遅延展開」 などで検索するといいでしょう。 また、既に実施しているかもしれませんが、 @echo %変数名% や @echo !変数名! を入れて常に変数名を表示させてチェックするようにすると問題点が見つけやすいと思います。
お礼
御礼が遅くなってしまいましたが、有難うございました。 色々検索して試してみたのですが、まだ上手く遅延展開が使いこなせなく、今回は時間もなかったため断念致しました。 また引き続き勉強していきたいと思います。
- notnot
- ベストアンサー率47% (4900/10358)
書かれているスクリプトは意味不明なので無視します。 LOG*.txtというファイル名の、最新30個を残してそれ以外を消す ということであれば、 cd /d C:\新規フォルダ\LOG for /f "skip=30" %%A in ('dir /b /o-d LOG*.txt') do del %%A
お礼
御礼が遅くなり大変失礼いたしました。 今回はシンプルにこちらで教えていただいたコマンドで対応することにしました。 非常に助かりました、有難うございます。
補足
御回答有難うございます。 実行してみたのですが上手く削除されないようです。 このコマンドはファイルの作成日時でみているのでしょうか? すみませんが教えていただけますでしょうか。 ちなみに今LOGフォルダにテスト用に用意しているファイルは6つで以下の内容です。 ファイル名 作成日時 LOG_19959596.txt 2012/9/11 LOG_20101010.txt 2012/9/11 LOG_20101221.txt 2012/10/19 LOG_20110801.txt 2012/10/19 LOG_20120915.txt 2012/10/19 LOG_20121012.txt 2012/10/19 いかがコマンド実行の結果です。 C:\新規フォルダ\batch>cd /d C:\新規フォルダ\LOG C:\新規フォルダ\LOG>for /F "skip=30" %A in ('dir /b /o-d LOG*.txt') do del %A
お礼
再度アドバイスいただき有難うございます。 ファイルは今のところほぼ毎日作成されるので、とりあえず時間もなかったこともあり最初にご投稿いただいたコマンドにて実行することに致しました。 まだ改善していく予定なので、こちらで教えていただいたのも試してみたいと思います。 有難うございます。