2003-08-01から1ヶ月間の記事一覧

変数置換の順序

CMD

変数の置換や構文解析の順序だが、いろいろやってみた結果次のようである。 (1) 環境変数の置換、引数の置換が同順序で最初 (2) if/for/( ) 等の構造を持った文の構文解析、およびリダイレクトの判断等が同順序 (3) for制御変数の置換 (4) 環境変数遅延展開…

スクリプト中のコメント

CMD

8/15: 【続】スクリプト中の未定義環境変数の謎で、 >「スクリプト中の任意の場所に、%" と "%で囲んだコメントが書ける」ということだ。 と書いたが、ちょっと間違っていた。%" "% で囲むというよりは、% % で囲まれていればいい。その時テストした際には…

【続々々】ディレクトリかどうかの判断

CMD

昨日の記事に対し、 >私は、dir "対象" /a:d してみて errorlevel を見ます。 NUL に頼るより確実では? というコメント*1を頂いた。DOSの時代から、ディレクトリのチェックは\NULを使ってやるものという先入観を持っていた。 いまや、dirコマンドにも/adオ…

【続々】ディレクトリかどうかの判断

CMD

体調が悪い(先週金?土は38度の熱でうなりながら寝ていた)ので、小ネタ。 7/28:ディレクトリかどうかの判断で、パスが " " で囲まれると、if exist によるる \NULの存在チェックがうまく行かないことに対する対策を書いた。>(1) for制御変数にいれ、ショー…

最近おどろいたこと

TV

フジTVの番組でクイズヘキサゴンというのがある。先週の番組で、「渋谷女子高生70%」(もしかしたら80%だったかも)が正解した問題として紹介されたのが、「小泉首相の前の首相は?」という問題。一代前だからそんなに難しいことは無いとしても、渋谷女子高生…

隠し環境変数の謎

CMD

昨日書いた %" "% のコメントに機能に絡んで、" " に囲まれた環境変数名が使えないものかやってみた。が、 set "AA"=123 環境変数 AA が定義されていません となる。つまり、 set AA と同じ結果になる。ついでに、 set ""=123 をやってみたところ、set と同…

【続】スクリプト中の未定義環境変数の謎

CMD

昨日の続きである。 環境変数名に空白が含まれても良いとか、数字でも良いとか書いたが、日本語ももちろんOKのようである。 またいくつかの記号も使える。なんと % も使える。スクリプト中では、% は %% と書くので、以下のようになる。 setlocal enabledela…

スクリプト中の未定義環境変数の謎

CMD

昨日、スクリプト中での未定義環境変数の振る舞いが良くわからないと書いた。 実際 set _= if defined _ if not "%_%" == "%_: =%" set _="%_%"</b> と書いて実行すると、 コマンドの構文が誤っています。 if defined _ if not "" == " =_" となってしまう。なぜ…

お便りに応えて

CMD

コメント*1にはコメントでと思いましたが、本文のネタが無いので本文でお返事します。>バッチコマンドスクリプトで個人用ツールをちょくちょく組んでいるものです。長いものだと 2000行近くなることもあります。これには驚きました。BATにそのレベルのもの…

WHICHコマンド (6) 〜最後〜

CMD

最終回は残りの部分。1回目の仕様で書いた、 (5) PATHをサーチして見つけた最初の実行ファイルのフルパスを環境変数「 _ 」にセットする の部分であるが、最後なので全文を掲載する。例によってインデントは2バイト空白なのでコピーペーストする人は注意。PA…

WHICHコマンド (5) 〜コマンド探索(後編)〜

CMD

5回目は、PATH環境変数のサーチ。基本的には前回と同じチェックを、PATHの内容を順次付加しながら行っていく。今回は最初にスクリプトを示す。 全体については2回目を参照。そこで書いた【パスのサーチ】というのが以下である。入力された文字列は、%%Xに入…

WHICHコマンド (4) 〜コマンド探索(前編)〜

CMD

4回目は、PATH環境変数を使ったサーチの前にcmd.exeが行う実行ファイルチェックの部分について。 このケースには、 (1) コマンドとして入力された文字列がそのまま実行ファイル名である場合 (2) コマンドとして入力された文字列にPATHEXTの内容を付加したも…

WHICHコマンド (3) 〜DOSKEYマクロのサーチ〜

CMD

3回目は、DOSKEYマクロのサーチである。関連したスクリプト部分を以下に示す。2回目も参照。 01 【前処理】 02 for %%X in (%*) do ( 03 for /f "delims=" %%A in ('DOSKEY /MACROS') do ( 04 for /f "delims==" %%B in ("%%A") do if /i "%%B" == "%%X" ech…

【続々】標準入力からの読み取り

CMD

8/5記事においていったんギブアップした標準入力の読み取りではあるが、ちょっと思いついたので、WHICHコマンドの連載を中断してこっちを書く。set /pによる標準入力読み取りにおいて空行とEndOfFileが区別できないのは確かである。しかし、空行には次にいず…

WHICHコマンド (2) 〜メインループとビルトインコマンド〜

CMD

昨日の1回目はDOSKEYの説明で疲れたので今日の、2回目は軽く、全体のメインループと、比較的簡単なビルトインコマンドサーチ部分を書く。【 】の部分は3回目以降の説明である。便宜上、行番号をつける。 01 @echo off 02 set _= 03 setlocal 04 set BLT=ASSO…

WHICHコマンド (1) 〜仕様とDOSKEYマクロ〜

CMD

実験のネタが尽きてきたので、これから何回かに分けて自作のWHICH.BATというスクリプトの解説でもしようかと思います。 まずは、仕様から。 unixにwhichというコマンドがある。シェルがコマンドを実行する際にPATH環境変数をサーチするが、その実際に実行さ…

【続】標準入力からの読み取り

CMD

7/21標準入力からの読み取りにおいて、set /p コマンドによる標準入力からの読み取りをパイプから行った場合、タイミングが合わないので数行おきにしか読めないと書いた。これを確かめてみた。 1行出力ごとに1秒待つプログラムを作成した。(プログラムはフリ…