2004-02-01から1ヶ月間の記事一覧

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 文書ファイル名 等としても、コマンドプロンプトから直接ファイル名などを入れたのと同じように実行されま…