• ベストアンサー

MS-DOSでのファイル/フォルダ一括削除

以下のようなフォルダ、ファイルがあるとし、LOGDIR下にある「200803」の文字列を 含まないファイル及びフォルダをDOSコマンド(Win2003)で削除(できれば一括で) する方法を模索しています。 Cドライブ   |   |   +LOGDIR      |      +---LOG20080228_084539    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080229_101553    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080301_132059    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080302_185945    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      |      |-----test20080229_085523.txt    <--- 削除対象ファイル      |      |-----test20080229_092310.txt    <--- 削除対象ファイル      |      |-----test20080301_153859.txt    <--- 削除対象ファイルでない      | 方法をご存知の方、いらっしゃいませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

MSDOSだと無理と思ったら、Windowsですね。 LOGDIRの直下だけ見れば良いのでしょうか。 cd \logdir rem ファイルの処理 for %%F in (*) do (  call :check "%%F"  if ERRORLEVEL 1 DEL "%%F" ) rem ディレクトリの処理 for /d %%F in (*) do (  call :check "%%F"  if ERRORLEVEL 1 rd /s "%%F" ) goto :eof rem 引数に200803が含まれればERRORLEVELを1に :check set A=%~1 rem 200803という文字列を削除して元と等しければ含まれていない if "%A%"=="%A:200803=%" exit /b 0 exit /b 1

mgkun
質問者

お礼

できました。 「200803という文字列を削除して元と等しければ含まれていない」 という方法があったのですね。目からウロコです。 早速使わせていただきます。 ありがとうございました。

その他の回答 (2)

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

------------------------------------------------------------ 基本の方針は、 ========================================================== まず他のディレクトリ(LOGDIRtmp)に名前を変え、 必要なものだけコピーする ========================================================== ということで考えてみます。 この方法の良い副作用としては、前回(1ヶ月前)の分が残せることです。 [仮定]: : C:\LOGDIRtmp が他で使われていない。 : ディレクトリの構成やファイル名は、サンプルの様に規則正しいものとする。 以下のコードを参考にしてみてください。 ========================================================== バッチファイル cleanOM.ba ========================================================== : : cleanOM.bat (clean Other Months) : @echo off if "%1"=="" goto :err_para : set d0=C:\LOGDIRtmp set d1=C:\LOGDIR if not exist %d1% goto :err_dir if exist %d0% rmdir /s %d0% ren %d1% LOGDIRtmp mkdir %d1% @echo on cd /D %d0% for /D %%i in ( LOG%1* ) do mkdir %d1%\%%i for /D %%i in ( LOG%1* ) do copy %%i\*.txt %d1%\%%i for %%i in ( %d0%\test%1*.txt ) do call copy %%i %d1% : rmdir /s/q LOGDIRtmp @echo off goto :end: : ----------------------------------------------------- : :err_dir echo Can't find %d1% goto :end: :err_para echo cleanOM.bat YYYYMM goto :end: : :end ==========================================================

mgkun
質問者

お礼

ありがとうございます。 「C:\LOGDIRtmp が他で使われていない。」という前提条件が、 こちらの条件に一致しないので、この方法は採用させていただきませんでした。

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

RMDIR [/S] [/Q] [ドライブ:]パス この /S スイッチを付けて実行 自分ならバッチファイルを作って不要なファイルとディレクトリだけを削除するようにします

mgkun
質問者

補足

早速の回答ありがとうございます。 質問が不備ですみません。 私もバッチファイル化を色々やっているのですが、うまくいきません。 削除対象文字列は実行年月であり、前月以前の年月ファイル/フォルダや、全く関係ない文字列のファイル/フォルダを削除したいのです。 回答頂いた  RMDIR [/S] [/Q] [ドライブ:]パス では、削除対象パスを都度指定する必要(変数化)がありますが、バッチ文の変数化がわからず困っています。

関連するQ&A