2004-01-01から1年間の記事一覧
ビルトインコマンドの多く( echo は違うようだが)で、パラメータの区切りに、空白の他、, ; = が使える。コマンド処理の時点で空白になっているようだ。 例えば、 dir a.txt;b.txt,c.txt も可能だし、 for=%I=in=(A;B=C),do=@echo %I では、A B C が1行ずつ…
以前の記事において、 昨日の記事に対し、 私は、dir "対象" /a:d してみて errorlevel を見ます。 NUL に頼るより確実では? というコメントを頂いた。ただ、if existで一気にチェックできるコンパクトさは捨てがたい。ということで、もう少しあがいてみま…
続き。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 コマンドの構文が誤…
前回書いた環境変数へセットする方式の tail コマンドでは、添え字付き環境変数へのセットで、call 命令を使う。前回書いたような eval 的な call の使い方と、実際にサブルーチンコールする場合とでの処理時間を念のため計ってみた。 for /l %%I in (1,1,10…
前回書いた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制御変数から添え字付き環境変数へのセットの話の続き。もちろん、任意の内容を安全にセット出来なれればならない。set の = の左辺のみ2度評価して、右辺は1度しか評価してはいけないわけだが、1文でやるのは前回無理とわかった(実は書いた以上にもいろ…
網野善彦氏、27日死去とのこと。もっと若いかと思っていたけど、76歳。そんな歳だったのね。世に出たのが遅かったのでそういう印象を持ってたんでしょうね。 amazonで検索すると共著もあるんだろうけど249件も引っ掛かる。 蒙古襲来―転換する社会 網野善彦 …
for /f 版の tail を作るに当たっての難関は、遅延展開を使わないで、添え字付き環境変数へのセットだ。unix で 配列変数機能の無い古い sh では、eval SAVE$J=\$VALUE とやるのが定石だ。これを参考に、左辺は call set SAVE%%J%%= と call を使う方法が思…
昨日の head コマンドだが、第一パラメータで、+10 とか /E 等の more の有効なオプションを指定してしまうと、第二パラメータにファイル名を指定しても無視され標準入力待ちになってしまう。とりあえず、 set "OPT=%~1" if "%OPT:~0,1%"=="/" echo>&2 コマ…
昨日書いたように、for 文中での環境変数の直近値の参照方法はいろいろある。そこで、 以前あきらめた head コマンドの for /f での実現をやってみた。ただし、空行はスキップされると言う for /f の仕様だけは我慢することになる。一方、副産物だが、do ( )…
if や for や ( ) の内部での % での環境変数置換は最初に行われるため、複合文内部で環境変数の値を変更してもその新しい値を参照しにくい。この参照の仕方を整理しておく。(1) 遅延環境変数展開を使う これが一番簡単であるが、デメリットとしては、% で展…
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と、制御変…
バッチススクリプトでは通常先頭で、@echo off するので、デバッグ時以外はコマンド実行のエコーを目にすることはあまり無い。 最近気づいたのだが、以下の一部のオプションなどについて、小文字で入力しても大文字になってエコー表示される(WXPで確認)。 if…
前回からの続き。 set X=echo 1^ echo 2 という風に環境変数AAにセットした2行の命令をそれぞれ実行するにはどうするか。前回書いたように、 %X% !X! とも駄目である。 if や for や ( ) の構文解析が % による環境変数置換に先立って行われることを思い出し…
^ による行の継続を試している時に、環境変数に改行を含んだ文字列をセットできることに気づいた。 set AA=123^ 456 のように間に空行をはさむと、AA に 123 改行 456 がセットされる。 set AAA=123^ 456^ 789 のようにすれば何行でも入る。ただし、この値を…
findstr コマンドに、 /L 検索文字列をリテラルとして使用します。 /R 検索文字列を正規表現として使用します。 /C:文字列 指定された文字列をリテラル検索文字列として使用します。 というオプションがあるが、/L の「リテラル」と /C の「リテラル」の意味…
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Filesystem Win95TruncatedExtensions 変更DW =0 ショートネーム拡張子の生成ルール変更いまさらながらの変更。何がどのように変わるかの情報が無く、今まで放っておいたが、一時的に変えてみて問題が…
昨日、の続き。 昨日書いた、:getline サブルーチンだが、「空行とEOFを区別できない」という set /p コマンドの仕様からああいう機能になってしまった。しかし、実際 tail コマンドを書こうとするとどうも使いにくい。そこで、まず普通の1行入力機能を持っ…
以前、head コマンドについて書いたが、ふと思い立って続編の tail コマンドを書いてみようかと思った。 前回のスクリプトは行入力と head のメインロジックが混じっており、ちょっと汚いので1行入力部分を :getline というサブルーチンにしてみた。:getline…
昨日の記事において、 call echo %%%A%%% と書いたが、この時、^ で % をquote出来るのでは?と思って、 call echo ^%%A%^% としてみた(sh だと、eval echo \$$A に相当)ところ、表示されるのは、A だけである。 どうも、^ によるquote処理より、%による展開…
10月29日記事において、 また、call バッチファイル名 や call :ラベル名 だけではなく、call CMDビルトイン>コマンド や call 実行ファイル名、call 文書ファイル名 等としても、コマンドプロンプトから直接ファイル名などを入れたのと同じように実行されま…
溜まっていた「四季 夏」と「四季 秋」を一気に読んだ。困った。過去の両シリーズを全部読み直さなければ。長編だけで20冊。 1年前になぜか1冊目だけ再読したけど、またもう一回かな。「春」を読んだ時の「この調子で冬までいくとどうなっちゃうんだろう?…
久々にTVの話題。また「トリビアの泉」の話だが、それ以外にTVを見てないわけではない。手相用語で生命線率というのがあるそうだ。生命線の長さだが、手の大きさの影響を打ち消すために、それを中指の付け根から手首までの距離で割ったものを生命線率という…