はじめに
本ページは、ウインドウズ系全般のティプスメモです。
そう、はじめはVB系のティプスメモだったのですが…いつの間にか、ウインドウズ系全般のティプスメモになってしまいました。
ちなみに、ティプス(Tips)とは、マニュアルに書かれていない技法や裏わざのことですが、本ページでは、私が経験してこれはと思ったノウハウのメモになっています。
尚、以下は本サイトの最新情報(ブログ)です。
それでは、本ページが何かのお役に立てれば幸いです。ごゆっくりご覧ください。
◆ DOSバッチファイルでのfor文とcall文等について
複数のファイルをcopyコマンドで一つに連結し、sortコマンドでソートした後、重複行を削除したいと思い、 UNIXでのuniqコマンドに相当するものがWINDOWSでもないかと探してみました。
ちなみに、uniqコマンドとは、重複行を単一行のユニーク(uniq)にするコマンドです。
- http://www.fpcu.jp/dosvcmd/bbs/log/unixdoswindows/3-0062.html
そこにDOSバッチファイルでのuniqコマンドもどき(uniq.bat)のソースがありました。 しかし、たった14行のソースなのですが全く読めません(わかりません)。 そこで、調べてみました。以下はそのメモです。
uniq.batのソースの引用
- echo off
- set prev=
- if not exist "%1" goto error
- for /f "tokens=* delims=" %%L in ( %1 ) do call :sub %%L
- goto exit
- :sub
- if not "%prev%"=="%*" set prev=%*&&echo %*
- goto :EOF
- :error
- echo.
- echo 表示したいファイル名を指定してください。
- echo [例] uniq.bat file.txt
- echo.
- :exit
ソース説明
-
1の『echo off』
エコーオフです(そのまんま)。 ちなみに、エコーオンでコマンドを実行すると、コマンド実行文そのものやその実行結果が、すべてコマンドプロンプトに出力される。 エコーコマンドのみのエコー出力をしたい場合は、『echo off』にします。また、『echo off』自体もオフにしたい場合は『@echo off』とします。 -
2の『set prev=』
環境変数の設定です。重複を求めるために読み込んだ一行分データを格納する変数です(この段階ではなにも設定していない)。 -
3の『if not exist "%1" goto error』
起動時の第一引数(%1)が存在しない時は、『goto error』しています。 -
4の『for /f "tokens=* delims=" %%L in ( %1 ) do call :sub %%L』
第一引数(%1)で指定されたファイルから一行読み込んで変数『%%L』にセットし、 別プロセス(call)でサブルーチン『sub』を、引数に『%%L』の値をセットして呼んでいます。 これを、ファイルのすべての行に対して繰り返『for』します。- for文に関して詳しい説明は、以下を参照願います。
http://forum.nifty.com/fpcu/dosvcmd/batch.htm#for
- for文に関して詳しい説明は、以下を参照願います。
-
5の『goto exit』
『goto exit』して処理を終了しています。 -
6の『:sub』
サブルーチンです。別プロセスになります。 -
7の『if not "%prev%"=="%*" set prev=%*&&echo %*』
環境変数prevとサブルーチン全引数をまとめたもの(%*)、つまり、一行読みデータが等しくないかを判断し、 もしそうなら、環境変数prevに一行読みデータ(サブルーチン全引数のまとめもの(%*))を設定しなおして、 そのコマンドが成功したら(&&)、一行読みデータ(%*)をエコーする。
補足:&&は、直前のコマンドが成功したら&&以降を実行すること。また、%1〜%9は、引数の個数分に対応しており、%*は、それをすべてまとめたもの。 -
8の『goto :EOF』
WindowsNT/2000/XPでは、あらかじめ暗黙に定義された「ファイル末尾」を意味するラベル 『:EOF』 が利用できる。 -
9から14
割愛、ちなにみ『echo.』は、空行出力とのことです。- 参考 : http://forum.nifty.com/fpcu/dosvcmd/batch.htm
uniq.bat使用例
C:\Documents and Settings\xxx>type test.txt 123456789 111111111 111111111 111111111 222222222 C:\Documents and Settings\xxx>uniq test.txt C:\Documents and Settings\xxx>echo off 123456789 111111111 222222222
uniqコマンドを実行したことにより、111111111の行がユニークになりました。
おわりに
以下のページには、すべてのTIPSがあります。もしよろしければ、どうぞ!
尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくVB-TIPS掲示板へご指摘ください。