2004-01-01から1年間の記事一覧

パラメータ区切り文字の謎

CMD

ビルトインコマンドの多く( echo は違うようだが)で、パラメータの区切りに、空白の他、, ; = が使える。コマンド処理の時点で空白になっているようだ。 例えば、 dir a.txt;b.txt,c.txt も可能だし、 for=%I=in=(A;B=C),do=@echo %I では、A B C が1行ずつ…

【続々々々】ディレクトリかどうかの判断〜whichコマンドの改訂版

CMD

以前の記事において、 昨日の記事に対し、 私は、dir "対象" /a:d してみて errorlevel を見ます。 NUL に頼るより確実では? というコメントを頂いた。ただ、if existで一気にチェックできるコンパクトさは捨てがたい。ということで、もう少しあがいてみま…

【続々々】tailコマンドの作成

CMD

続き。tail コマンドの完成版。+ オプションもつけたが、単に more の機能を使っているだけ。 @echo off setlocal set MORE= if not defined LINE set LINE=20 set "OPT=%~1" if not defined OPT goto pipe if "%OPT:~0,1%"=="/" echo>&2 コマンドの構文が誤…

call命令のオーバーヘッド〜添え字付き環境変数へのセット

CMD

前回書いた環境変数へセットする方式の tail コマンドでは、添え字付き環境変数へのセットで、call 命令を使う。前回書いたような eval 的な call の使い方と、実際にサブルーチンコールする場合とでの処理時間を念のため計ってみた。 for /l %%I in (1,1,10…

【続々】tailコマンドの作成

CMD

前回書いた2つの方法で書いた tail コマンドの基幹部分を示す。 (1) 中間ファイル方式 set I=-%LINE% set J=0 for /f "delims=" %%A in ('more %1') do ( set /a J+=1, I+=1 echo.%%A>%TEMPFILE% call set /p SAVE%%J%%=< %TEMPFILE% call set "SAVE%%I%%=" …

for制御変数から添え字付き環境変数へのセット

CMD

for制御変数から添え字付き環境変数へのセットの話の続き。もちろん、任意の内容を安全にセット出来なれればならない。set の = の左辺のみ2度評価して、右辺は1度しか評価してはいけないわけだが、1文でやるのは前回無理とわかった(実は書いた以上にもいろ…

網野善彦氏死去

網野善彦氏、27日死去とのこと。もっと若いかと思っていたけど、76歳。そんな歳だったのね。世に出たのが遅かったのでそういう印象を持ってたんでしょうね。 amazonで検索すると共著もあるんだろうけど249件も引っ掛かる。 蒙古襲来―転換する社会 網野善彦 …

【続】call 命令の謎

CMD

for /f 版の tail を作るに当たっての難関は、遅延展開を使わないで、添え字付き環境変数へのセットだ。unix で 配列変数機能の無い古い sh では、eval SAVE$J=\$VALUE とやるのが定石だ。これを参考に、左辺は call set SAVE%%J%%= と call を使う方法が思…

【続】tailコマンドの作成

CMD

昨日の head コマンドだが、第一パラメータで、+10 とか /E 等の more の有効なオプションを指定してしまうと、第二パラメータにファイル名を指定しても無視され標準入力待ちになってしまう。とりあえず、 set "OPT=%~1" if "%OPT:~0,1%"=="/" echo>&2 コマ…

head コマンド再び

CMD

昨日書いたように、for 文中での環境変数の直近値の参照方法はいろいろある。そこで、 以前あきらめた head コマンドの for /f での実現をやってみた。ただし、空行はスキップされると言う for /f の仕様だけは我慢することになる。一方、副産物だが、do ( )…

複合文中での環境変数参照

CMD

if や for や ( ) の内部での % での環境変数置換は最初に行われるため、複合文内部で環境変数の値を変更してもその新しい値を参照しにくい。この参照の仕方を整理しておく。(1) 遅延環境変数展開を使う これが一番簡単であるが、デメリットとしては、% で展…

for文とgoto文

CMD

for 文から goto 文で抜け出ることが出来る。 が、抜け出なくても goto しただけで、for 文の機能が無効になるようだ。 @echo off for /l %%I in (1,1,5) do ( if %%I==3 goto x echo A %%I :X echo B %%I ) を実行すると、 A 1 B 1 A 2 B 2 B %Iと、制御変…

コマンド実行時のエコー表示の謎

CMD

バッチススクリプトでは通常先頭で、@echo off するので、デバッグ時以外はコマンド実行のエコーを目にすることはあまり無い。 最近気づいたのだが、以下の一部のオプションなどについて、小文字で入力しても大文字になってエコー表示される(WXPで確認)。 if…

【続】環境変数に改行文字をセット

CMD

前回からの続き。 set X=echo 1^ echo 2 という風に環境変数AAにセットした2行の命令をそれぞれ実行するにはどうするか。前回書いたように、 %X% !X! とも駄目である。 if や for や ( ) の構文解析が % による環境変数置換に先立って行われることを思い出し…

環境変数に改行文字をセット

CMD

^ による行の継続を試している時に、環境変数に改行を含んだ文字列をセットできることに気づいた。 set AA=123^ 456 のように間に空行をはさむと、AA に 123 改行 456 がセットされる。 set AAA=123^ 456^ 789 のようにすれば何行でも入る。ただし、この値を…

findstrコマンドの使い方

CMD

findstr コマンドに、 /L 検索文字列をリテラルとして使用します。 /R 検索文字列を正規表現として使用します。 /C:文字列 指定された文字列をリテラル検索文字列として使用します。 というオプションがあるが、/L の「リテラル」と /C の「リテラル」の意味…

ショートネーム拡張子の生成ルール変更

Win

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Filesystem Win95TruncatedExtensions 変更DW =0 ショートネーム拡張子の生成ルール変更いまさらながらの変更。何がどのように変わるかの情報が無く、今まで放っておいたが、一時的に変えてみて問題が…

tail コマンドの作成

CMD

昨日、の続き。 昨日書いた、:getline サブルーチンだが、「空行とEOFを区別できない」という set /p コマンドの仕様からああいう機能になってしまった。しかし、実際 tail コマンドを書こうとするとどうも使いにくい。そこで、まず普通の1行入力機能を持っ…

head コマンドその後

CMD

以前、head コマンドについて書いたが、ふと思い立って続編の tail コマンドを書いてみようかと思った。 前回のスクリプトは行入力と head のメインロジックが混じっており、ちょっと汚いので1行入力部分を :getline というサブルーチンにしてみた。:getline…

^ によるquoteについて

CMD

昨日の記事において、 call echo %%%A%%% と書いたが、この時、^ で % をquote出来るのでは?と思って、 call echo ^%%A%^% としてみた(sh だと、eval echo \$$A に相当)ところ、表示されるのは、A だけである。 どうも、^ によるquote処理より、%による展開…

CALL命令の謎

CMD

10月29日記事において、 また、call バッチファイル名 や call :ラベル名 だけではなく、call CMDビルトイン>コマンド や call 実行ファイル名、call 文書ファイル名 等としても、コマンドプロンプトから直接ファイル名などを入れたのと同じように実行されま…

森の四季 夏・秋

溜まっていた「四季 夏」と「四季 秋」を一気に読んだ。困った。過去の両シリーズを全部読み直さなければ。長編だけで20冊。 1年前になぜか1冊目だけ再読したけど、またもう一回かな。「春」を読んだ時の「この調子で冬までいくとどうなっちゃうんだろう?…

生命線率

TV

久々にTVの話題。また「トリビアの泉」の話だが、それ以外にTVを見てないわけではない。手相用語で生命線率というのがあるそうだ。生命線の長さだが、手の大きさの影響を打ち消すために、それを中指の付け根から手首までの距離で割ったものを生命線率という…