当初、不具合の理由がわからず、サーバーマシン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