Yahoo知恵袋 バッチコマンド【高度なテキストファイル検索方法】
Yahoo知恵袋の質問から。こちらもユーザ登録していないのでここに回答を書きます。
(2008-12-27 追記) Yahoo知恵袋から質問が消えていました。
同じ質問がOKWaveにあったのでリンクを張っておきます。→http://okwave.jp/qa4491964.html
バッチコマンド【高度なテキストファイル検索方法】xpfjemie1680さん
いつも大変御世話になっております。
使用端末:Windows2000SP4ツリー構成は以下の(1)〜(4)になります。
(1)【E:\test】内にtest.batがあります。
(2)【E:\IFFILE\】内には、テキストファイル(拡張子はtxt)が毎日不定期な数(1ファイルだったり、15ファイルだったり)あります。
(3)【E:\IFFILE\CHK】内には【GOOD】【0_FILE】【No_File】フォルダがあります。
(4)検索対象ファイル:50ファイル今回悩んでいるの、test.batのコードで、具体的に何をしたいかと言うと・・・
(1)【E:\IFFILE\】内に(4)のファイル名にファイル存在有無の検索をかけます。
検索条件は以下の通りです・ファイルが存在しない場合(※1)
・ファイルがあるが、サイズが0のファイルが存在する場合(※2)
・ファイルがあり、サイズがあるファイルが存在する場合(※3)(※1)【E:\IFFILE\CHK\No_File】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、
そのファイルの中に【ファイルがありませんでした。】のメッセージを表示。(※2)【E:\IFFILE\CHK\0_FILE】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、
そのファイルの中に【0件データでした。】のメッセージを表示。(※3)【E:\IFFILE\CHK\GOOD】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、
そのファイルの中に【データのある正常なデータでした。】のメッセージを表示。コードは中途半端ですが、下記の通りです。
set yy=%date:~2,4%
set mm=%date:~7,2%
set dd=%date:~10,2%
REM =======================================================
echo %YMD%,%HHMMSS%,"サイズ検索処理開始"
REM =======================================================
@echo off
for /f %%a in ("E:\IFFILE\L2001.TXT") do set chk=%%~za%
if %chk%==0 goto :END
echo データのある正常なデータでした。。 >> E:\IFFILE\CHK\GOOD\L2001_%yy%%mm%%dd%.txt
goto :EOF
:END
echo 0件データでした。 >> E:\IFFILE\CHK\0_FILE\L2001_%yy%%mm%%dd%.txt
REM =======================================================
echo %YMD%,%HHMMSS%,"サイズ検索処理終了"
REM =======================================================どうもファイルがない場合の処理記述方法と、フォルダ内すべてのファイルの連続検索がわかりません。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1320785008
どうすればよいのでしょうか?
※(1)〜(4)は丸数字
(4)の記述では検索対象のファイル50ファイルをどのように指定するかが曖昧ですが、
まずはlist.txtというテキストファイルにファイル名を列挙する方法の場合、
REM 検索対象ファイル名がテキストファイルに格納されている場合の処理 REM E:\IFFILE\CHK\list.txtの各行に1つのファイル名が列記されている echo off REM 日付のセット(yymmdd) set dt=%date:~-8% set dt=%dt:/=% REM 検索対象ファイル名に対してチェック用サブルーチンを呼び出す。 for /F %%f in (E:\IFFILE\CHK\list.txt) do call :sub %%f echo 検索終了 exit /b :sub REM 日付を付加したファイル名を求める %~n1(拡張子を除いたファイル名) %~x1(拡張子) set file=%~n1_%dt%%~x1 REM ファイルが存在しない場合 if exist E:\IFFILE\%1 goto sizeck echo ファイルがありませんでした。>E:\IFFILE\CHK\No_File\%file% goto :EOF :sizeck REM サイズチェック for %%S in ( E:\IFFILE\%1 ) do set chk=%%~zS if %chk% EQU 0 goto Zero echo データのある正常なデータでした。> E:\IFFILE\CHK\GOOD\%file% goto :EOF :Zero echo 0件データでした。> E:\IFFILE\CHK\0_FILE\%file% goto :EOF
【E:\IFFILE\CHK】にあるテキストファイル名を元にチェックする場合なら、
REM 検索対象ファイルが E:\IFFILE\CHKに格納されている場合の処理 echo off REM 日付のセット(yymmdd) set dt=%date:~-8% set dt=%dt:/=% REM 検索対象ファイル名に対してチェック用サブルーチンを呼び出す。 for %%f in (E:\IFFILE\CHK\*.txt) do call :sub %%~nxf echo 検索終了 exit /b :sub REM 日付を付加したファイル名を求める %~n1(拡張子を除いたファイル名) %~x1(拡張子) set file=%~n1_%dt%%~x1 REM ファイルが存在しない場合 if exist E:\IFFILE\%1 goto sizeck echo ファイルがありませんでした。>E:\IFFILE\CHK\No_File\%file% goto :EOF :sizeck REM サイズチェック for %%S in ( E:\IFFILE\%1 ) do set chk=%%~zS if %chk% EQU 0 goto Zero echo データのある正常なデータでした。> E:\IFFILE\CHK\GOOD\%file% goto :EOF :Zero echo 0件データでした。> E:\IFFILE\CHK\0_FILE\%file% goto :EOF
となります。
Windows 2000の環境がないので机上とXPでのチェックしかしてません。
この回答を見てくれればいいんですが…。