━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ いざというときに役立つMS−DOS 執筆:速星 千里 第48号(2004.04.10) バッチファイル開発ツール(2) 5743部配信 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <目次> ■ はじめに ● 来週は休刊します ■ バッチファイル開発ツール(2) ● 「/? の使い方が誤っています」 ● 限りなくバグに近い仕様 ● 回避策 ■ ダブルクォーテーションの必要性 ● 一般論 ● 「DEBUGHLP.BAT」の場合 ■ デバッグ支援ツール:修正版 ----☆PR☆-------------------------------------------------------------- ■□■□■□ キャッシングなら東京三菱キャッシュワン □■□■□■□■ ●実質年率15.0〜18.0%  ●ご融資1万〜300万円まで ●年会費・手数料0円  東京三菱銀行・UFJ銀行・コンビニ等、全国約40,000台のATMでご利用可能 □■□■最 短 で そ の 日 の う ち に キ ャ ッ シ ン グ 可 能■□■□        http://211.10.20.135/a/a.cgi?k30180Em01507 ---------------------------------------------------------------☆PR☆--- ─ PR ──────────────────────────────── ☆ラブチャンネル☆   出会いの巨大掲示板はココ! v(^_^o) http://a-u.jp/?2aq0002  ふりむいて ふりむいて・・・  いつも欲張りなくらい恋したいのに♪(*>^-'*)> ─ PR ──────────────────────────────── ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ はじめに ------------------------------------------------------------------------ 皆さん、こんにちは。速星です。   ------------------------------------------------------------------------ ● 来週は休刊します 来週(4月17日)は情報処理技術者試験前日のため、休刊させていただきます。 去年は惨敗した、ソフトウェア開発技術者試験に再挑戦してきます。 今後の発行予定の詳細は、当メルマガのホームページでご確認下さい。 http://www.geocities.co.jp/Bookend-Hemingway/4963/column/dos/ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ バッチファイル開発ツール(2) ------------------------------------------------------------------------ 前号(バッチファイル開発ツール)を発行後、読者の方から、意図通り動作しな い場合があるとのメールをいただきました。 今回は「DOSの実体」というテーマでお送りする予定でしたが、いただいたメー ルをうけ、当初の予定を変更して、ご報告いただいた動作についてじっくり検討 することにいたします。 なお、今回予定していた内容は、5月1日に改めてお送りすることにします。 ------------------------------------------------------------------------ ● 「/? の使い方が誤っています」 以下に、いただいたメールの要点を引用します。 >  今回のDEBUGHLP.BATのコーディングの下記部分は >  このままではちょっとまずいのではないでしょうか > >      if %1==/? goto USAGE >      if %1==-? goto USAGE > > 多分以下の間違いかと思います。 >   >      if "%1"=="/?" goto USAGE >      if "%1"=="-?" goto USAGE 前号に掲載したバッチファイルの場合、Windows2000では以下のようにエラーが 表示されるとのことです。 > DebugHelper Ver1.0 > Copyright(c) 2004 Chisato Hayahoshi > > /? の使い方が誤っています。 また、IFコマンドの条件文の両辺をダブルクォーテーションで囲った場合、以下 のように正常動作するとのことです。 > DebugHelper Ver1.0 > Copyright(c) 2004 Chisato Hayahoshi > > バッチファイルのデバッグ支援ツールです. > > DEBUGHLP [ドライブ:][パス]バッチファイル名 [オプション[ ...]] > > バッチファイル起動時のオプションが8個まで指定できます. > (9個目以降は記述しても無視されます) わざわざご報告いただき、どうもありがとうございました。 ------------------------------------------------------------------------ ● 限りなくバグに近い仕様 メールにてご報告いただいた事象について、急きょ、こちらで確認しましたが、 Windows98のDOS窓やPC98のMS−DOS6.2では正常に動作しています。 NT系のWindowsは私の手近にないため詳しい動作状況が確認できていませんが、 どうやら、これはWindows2000,XPのDOS窓に特有の問題のようです。 メールでご報告いただいた内容から推察するに、前号のバッチファイルがオプショ ン「/?」を指定して実行されたときに、 > if %1==/? goto USAGE の「%1」が「/?」に展開されて生じる、下の1行が問題のようです。 > if /?==/? goto USAGE Windows2000,XPの場合、この部分を、IFコマンドのヘルプ「IF /?」が余分な文 字を伴って呼び出されたものと解釈して、エラーを出しているようです。 「IF /?」で表示されるヘルプを確認すると、IFコマンドの構文の1つは以下の ようになっています。 IF [NOT] 文字列1==文字列2 コマンド 「if /?==/? goto USAGE」はこの構文に当てはまっていますから、目的通り動作 しないのはWindows2000,XPのIFコマンドのバグともいえます。 しかし、プログラムを作る者の立場からいえば、オプションの頭2文字が「/?」 であればユーザはヘルプを呼び出そうとしているのだと解釈するのは、妥当なこ とと考えられなくもありません。 従ってこの振る舞いは、Windows2000,XPのコマンドプロンプトの、限りなくバグ に近い仕様であるといっていいでしょう。 ------------------------------------------------------------------------ ● 回避策 要は、IFコマンドで文字列の比較を行うときに、「IF」の直後に「/?」という文 字が来ないようにすればいいわけです。 従って、 > if "%1"=="/?" goto USAGE のように、両辺の文字列をダブルクォーテーションで囲えば問題は解決します。 別にダブルクォーテーションでなければならないという理由はありません(極端 な話、例えば音符記号「♪」で囲ってもエラーにはならないはずです)が、慣習 上、文字列を囲む際にはダブルクォーテーションが用いられます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ ダブルクォーテーションの必要性 ------------------------------------------------------------------------ では、どんな場合に、IFコマンド中で比較する文字列をダブルクォーテーション で囲う必要があるのでしょうか。 ------------------------------------------------------------------------ ● 一般論 まず構文規則上は、通常、文字列をダブルクォーテーションで囲う必要はありま せん。 C言語やJavaなどとは異なり、DOSではほとんどの場合、ダブルクォーテーショ ンを特別扱いせず(註)、単に文字列の一部とみなすからです。 (註)長いファイル名(第11号)やFINDコマンド(第46号)が代表的な例外    といえます。 しかし一般的にいえば、IFコマンドの条件文では文字列をダブルクォーテーショ ンで囲う習慣を付けた方がいいでしょう。 それは、変数が空の場合に構文エラーとなることを防ぐためです。 第23号で簡単に説明したように、変数は、その行の実行時に、自動的にその変 数の中身の文字列に置き換えられます。 このため、例えばバッチファイル中に、 > if %1==-? goto USAGE のように記述すると、そのバッチファイルがオプションなしで実行されたときは 「%1」の中身が空なので > if ==-? goto USAGE のように置き換えて実行されます。 これは、IFコマンドの条件式の左辺が欠けているため、文法エラーになります。 一方、文字列をダブルクォーテーションで囲って > if "%1"=="-?" goto USAGE とすれば、オプションなしでバッチファイルが実行されたときでも > if ""=="-?" goto USAGE のように左辺に文字列「""」が残るため、文法エラーにはなりません。 ------------------------------------------------------------------------ ● 「DEBUGHLP.BAT」の場合 さて、前号でご紹介した「DEBUGHLP.BAT」のうち、問題となっている部分は以下 のようになっていました。 > if "%1"=="" goto USAGE > if %1==/? goto USAGE > if %1==-? goto USAGE まず、オプションなしで起動された場合(つまり「%1」が空の場合)を考えます。 この場合、引用部1行目の記述によってラベル「USAGE」へと移動します。 下の2行は実行されません。 次に、「%1」が「/?」の場合を考えます。 2行目は、上で述べたように、条件式の両辺の文字列をダブルクォーテーション で囲って「if "%1"=="/?" goto USAGE」とすることにします。 これで当初の意図通り、2行目の記述によってラベル「USAGE」へと移動します。 このとき3行目は実行されません。 3行目は「%1」が空あるいは「/?」のときに実行される可能性がないため、ダブ ルクォーテーションで囲う必然性はないはずです。 しかし、今後の機能拡張時などに無用の混乱を避けるためにも、他の2行に合わ せて、文字列を囲っておくことにします。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ デバッグ支援ツール:修正版 ------------------------------------------------------------------------ 以上より、NT系Windowsの「IF /?」誤認問題に対応した修正版は、下のようにな ります。 -----(DEBUGHLP.BAT(修正版)ここから)----- @echo off echo DebugHelper Ver1.0a echo Copyright(c) 2004 Chisato Hayahoshi echo. if "%1"=="" goto USAGE if "%1"=="/?" goto USAGE if "%1"=="-?" goto USAGE command /y /c %1 %2 %3 %4 %5 %6 %7 %8 %9 goto END :USAGE echo バッチファイルのデバッグ支援ツールです. echo. echo DEBUGHLP [ドライブ:][パス]バッチファイル名 [オプション[ ...]] echo. echo バッチファイル起動時のオプションが8個まで指定できます. echo (9個目以降は記述しても無視されます) :END echo. -----(DEBUGHLP.BAT(修正版)ここまで)----- ------------------------------------------------------------------------ 今回はここまでです。 お疲れ様でした! 次号の予定は、「RAMディスク」です。 大容量メモリの一部をディスクとして活用する方法をご紹介します。 なお、来週は休刊しますので、次号の発行予定は4月24日となります。 ----☆PR☆-------------------------------------------------------------- ◆ クリックラウンジ -- クリックだけで報酬ゲット! ◆ 3月19日にオープンしたばかりの日本語版ペイドメール。 クリック単価はなんと最大11.11円。 登録者数の少ない今のうちがチャンス! 登録はこちらから → http://clicklounge.com/index.php?r=650 ---------------------------------------------------------------☆PR☆--- ----☆PR☆-------------------------------------------------------------- 〓 Prize-Prize 〓 アンケート協力やメール受信で手軽に小遣い稼ぎ! スポンサーからの商品案内のメール受信 → 1通につき1〜10円獲得 毎週実施の週間市場調査への回答 → 1回につき100円獲得 不定期実施の市場調査への回答 → 1回につき100〜500円獲得 ●登録 → http://www.prize-prize.com/pages/index.php?refid=chayahoshi ---------------------------------------------------------------☆PR☆--- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ コメントをお待ちしています ------------------------------------------------------------------------ 皆さんからの感想・質問・要望をお待ちしています。 「こんなテーマを扱ってほしい」 「こんなことはできるの?」 「このへんが分かりにくかった」 「1回の分量を増やしてほしい/減らしてほしい」 など、掲示板(下記URL)まで気軽にお願いします。 http://bbs9.otd.co.jp/dos/bbs_thread (スレッド表示) http://bbs9.otd.co.jp/dos/bbs_tree (ツリー表示) メールでもコメントを受け付けておりますので、そちらもご利用下さい。 tetrahedrane@yahoo.co.jp なお、いただいたコメントは、本マガジン上で引用する場合があります。 (メールアドレスやお名前は一切公開いたしません) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 感想・質問宛先 http://bbs9.otd.co.jp/dos/bbs_tree tetrahedrane@yahoo.co.jp ● 広告募集 当メルマガへの広告掲載をご希望の方は、下記アドレスまでお願いします。 tetrahedrane@yahoo.co.jp ● メルマガ交換広告募集 当メルマガとのメルマガ交換広告をご希望の方は、下記アドレスまでどうぞ。 tetrahedrane@yahoo.co.jp ● 登録・解除・バックナンバー http://www.geocities.co.jp/Bookend-Hemingway/4963/column/dos/ このメールマガジンは、『まぐまぐ』を利用して発行しています。 http://www.mag2.com/m/0000106066.htm (c) 2004 Chisato Hayahoshi