それでもDOSを使う人


@ECHO OFF
FOR /F %%I IN (%1) DO DIR %%I /S/OE/A-D/B >> FILELIST.TXT


FOR /F %%I IN (FILELIST.TXT) DO (
set /a COUNT+=1
@ECHO %COUNT% %%I
SET FILENAME=%%I
XDOC2TXT %%I> DATA.TXT
CALL :FLAGCHECK
)


PAUSE


EXIT


:FLAGCHECK
SET CHECK=,チェック
FINDSTR /M "子" DATA.TXT && SET CHECK=%CHECK%,子
FINDSTR /M "都" DATA.TXT && SET CHECK=%CHECK%,都
FINDSTR /M "道" DATA.TXT && SET CHECK=%CHECK%,道
FINDSTR /M "府" DATA.TXT && SET CHECK=%CHECK%,府
FINDSTR /M "県" DATA.TXT && SET CHECK=%CHECK%,県
FINDSTR /M "株 ㈱ ㈲" DATA.TXT && SET CHECK=%CHECK%,株


ECHO %FILENAME%%CHECK%>>調査結果.TXT

検索先のパス(ネットワーク上の共有フォルダのパス)を記述したファイルをドラックして作業開始。と。


http://www31.ocn.ne.jp/~h_ishida/にあるxdoc2txtというのを使って、エクセルだのワードだのなんだの中からターゲットの文字列を検索する「バッチ」であります。
エクセルだのワードだのPDFだのは、Windows標準のファイル検索では中身を引っ掛けられないため、わざわざこんな手間をかけて調査であります。


本来はPealで書かれたほんの数行のなんのヒネリも無いスクリプトなんでありますが……
Pealがインストールされていないサーバマシン上で実行する必要が発生した為に、急遽DOSで作成。
2000拡張コマンドを利用して、Forだの正規表現だの変数だのをバキバキつかった不思議なバッチになっちょります。


というか、なんも考えずにVBSでやればよかったんでありますな。
よく考えたらWindows2000にもWSHは標準で入ってるであります。
ふむふ。


For文を使う事でDOS上でもループするコマンドを書くことが可能なのでありますが、そのままFOR文の中に環境変数を記述すると、FORの行が実行された段階でカッコ内部の環境変数が全て展開されてしまうために、FORループ内で変数を書き換えても、FOR文を1周するまでは反映されないのであります。
なので、CALL文を使って環境変数を使う部分だけ外に追いやって別途処理。
呼び出したコマンドが終了すると、CALL文で呼び出した部分に戻るというCALL文の機能を利用しちょります。
GOTOやCALLでRETURNの記述方法が有ったような気もするんでありますが、見当たらなかったので見なかった事に。


で。パイプコマンドを使ってファイルに書き出してそれをチェックする形に。
FINDSTRで正規表現を使わずに複数行に分けてしまっているのは、発見した文字列のフラグを立てたかったため。
FINDSTRの戻り値で見つけた文字列が帰ってくるんだったら別なんでありますが……
加工するのも面倒なのでこんな形に。


……やっぱりVBSで作ればよかった……