自宅サーバーとしてIBM TinkPad X41 でWebサーバー、メールサーバーを立ち上げていますが、ここ1か月ぐらいwebサーバーが落ちたり、メールの受信ができないなどの不具合が出はじめていました。
 当初、不具合の理由がわからず、サーバーマシンX41の不調かと思いメモリーやハードディスクのチェックなどをしていましたが、メールサーバーのログを片っ端から開いてみると凍結メールが異常に大量にたまっていることが判明しました。
 全体で何通あるのか確認しようと思い、作成したのがこのバッチです。
 この3年間(実際は2か月ぐらい)で不正な転送メールが凍結メールとして130万通を超えてたまってしまい、再送処理とメールの受信処理でサーバーがパンクしていたのでした。
 

「FOR /R」の使い方

 「FOR /R」コマンドは、サブディレクトリを含めて指定のファイル名を探して1つづつ名前を返してくれるコマンドです。
 書式)FOR /R [ドライブ名:][パス] %%変数名 IN (ファイルリスト) DO コマンド
 
 ドライブ名:パスで指定したフォルダ以下でファイルリストで指定されたファイルを探します。
 

files.bat

@Title サブディレクトリを含めたファイル一覧
@rem
@echo off

rem -------------------------- 引数のチェック --------------------------
rem 引数1があるかチェックして設定されていなければ説明表示にジャンプする。
set p=
if "%~1" == "" (set /p p=フォルダーのパスを指定してください。) else (set p=%~1)
if "%p%" == "" (goto :hlp) else (call :arg_edt %p% a)

rem -------------------------- ここから条件の整理 --------------------------
rem 引数1のファイルが存在すればディレクトリーかファイルか判別する
if EXIST "%p%" (
     rem callで環境変数を展開する時は、「%」の個数が増えることに注意!!!
     call set w=%%rt%%
     call set ftype=%%w:~0,1%%
) else (
     set ftype=-
)

rem 指定のパスがディレクトリの場合、ファイルセットを「*」に、
rem ディレクトリでなければ引数の最後をファイルセットとして取り出します。
if /I "%ftype%" == "d" (goto :then_01) else (goto :else_01)
:then_01
     rem ifブロックもどきを使っているので「call」は不要となり「%」の個数も通常通りです。
     call :arg_edt %p% f
     set f=*
     set tp=%rt%
     goto end_if_01
:else_01
     rem 引数1を整形してファイル名を取り出します。
     call :arg_edt %p% dp
     set w=%p%
     set w=%w: =+%
     set w=%w:\= %
     set w=%w:/= %
     call :last_arg %w%
     set last=%last:+= %
     set f=%last%
     set tp=%rt%
:end_if_01

rem -------------------------- ここからメインの処理 --------------------------
echo ディレクトリ: %tp%
set /A n=0
set /A m=0
for /R "%tp%" %%I in (%f%) do call :sub "%%I"
echo.
echo %n% 個のファイルを処理しました。
rem -------------------------- 終了処理へ移動します。 --------------------------
goto :END

rem ================= ここからサブルーチン ====================
rem ファイル名の表示と処理のブロック
:sub
     rem if "%~t1" LSS "2015/MM/DD" (goto :then_sub_00) else (goto :else_sub_00)
     rem if %~z1 GTR %file_size% (goto :then_sub_00) else (goto :else_sub_00)
     rem if "%~a1" == "drahs----" (goto :then_sub_00) else (goto :else_sub_00)
     rem
     if "%~a1" == "--a------" (rem/TRUE) else (goto :else_sub_00)
     :then_sub_00
         set /A n+=1
         set w= %n%
         set d=%w:~-6%
         rem
         echo %d% : %~1
         rem 条件一致の場合の処理をここに記述
         rem find /N "検索文字列" %~1
         rem del %~1
         rem attrib +R -H +S %~1
         goto :end_if_sub_00
     :else_sub_00
         rem set /A m+=1
         rem set w= %m%
         rem set d=%w:~-6%
         rem 条件不一致の場合の処理をここに記述
     :end_if_sub_00
     rem pause
goto :EOF

rem -------------------------------------
rem 最後の引数を変数lastにセットします。
:last_arg
:lp_last_arg
     if "%~2" == "" goto :exit_lp_last_arg
     shift
     goto :lp_last_arg
:exit_lp_last_arg
set last=%1
goto :EOF

rem -------------------------------------
rem 引数の値を指定の方法で編集します。
:arg_edt
set rt=
if "%~1" == "" goto :EOF
if "%~2" == "" set rt=%~1
if "%~2" == "f" set rt=%~f1
if "%~2" == "d" set rt=%~d1
if "%~2" == "p" set rt=%~p1
if "%~2" == "n" set rt=%~n1
if "%~2" == "x" set rt=%~x1
if "%~2" == "a" set rt=%~a1
if "%~2" == "t" set rt=%~t1
if "%~2" == "z" set rt=%~z1
if "%~2" == "s" set rt=%~s1
if "%~2" == "nx" set rt=%~nx1
if "%~2" == "dp" set rt=%~dp1
if "%~2" == "pnx" set rt=%~pnx1
goto :EOF

rem -------------------------------------
rem 説明表示
:hlp
echo 説明表示
echo サブディレクトリを含めたファイルの一覧を表示します。
echo (使い方)
echo   %0 [drv:][\path\][*.ext]
echo.
pause

rem =================== 終了処理 ==================
:END
rem 必要があれば「pause」を加えて一時停止させます。
rem pause
echo on



ページトップへ戻る






元のページに戻る  ページを閉じる

連絡先:お問い合わせフォーム