Batch file to VBScript file (12) at 1999.Sep.20 Interrupt column 5 - 落ち穂拾い いやその。別にミレーの油絵ではなくてですね(誰が聞いとる、そんなこと>わし)。 実際に使ってみたという例から、余り恥かしくなくて、かつ他人にも役立つ可能性が 電子顕微鏡で見ると多少は認められるものを出す前に、ちょっと補足的に説明すべき かなぁと思ったことがあるので。 1. .WSHファイル  何かと言うと先ずは適当な.VBSや.JSを右クリックしてプロパティ、スクリプト  タブで適当にオプションを変更し、OKってやるとできるテキストファイルです。  実質ショートカットと同じ使い方ができるのですが:  1. ショートカットより小さい(とはいえ、どっちもクラスタサイズ(*1)以下なので    実際のHDD占有量は(ショートカットと)変わりませんけど)  2. 作業フォルダ(実行時のカレントディレクトリ)の情報を持たない    これが何故嬉しいかというと、*.wshをダブルクリックした時にカレント    ディレクトリがダブルクリックした場所のフォルダになるからです。    ショートカットだとうっかりしてると実体があるフォルダをカレントにして    実体(スクリプト)が起動しますから  3. *.wshは単なるテキストファイルなので、1度中身を見れば後は単なる.batでも    自動生成可能 (*1) スキャンディスクとかやると、「アロケーションユニットサイズ」と表示    されるもの。つまり、どんなファイルでもこのサイズの倍数でHDDやFDDに記憶    されるぞ。ってこと。FAT16だと1バイトの長さしかないファイルでも32KB分の    HDD容量を消費してたのが、FAT32だと4KBで済むよ。って記事を読んだことが    あるでしょう?ちなみにルートディレクトリはこのFATの制限より、ファイル    数の制限の方がきついのだが、今時一太郎Ver.3.0の話をするのもアレなので    省略(一太郎Ver.3.0は1つの文章ファイルを保存するのに3つファイルを    作った。という事実から始まる昔話。念の為だが、この話のオチは一太郎    Ver.3.0の文章なら今だって楽に読めるのに、Ver.4.0とかのはもう捨てるしか    ない。という、多分大方の読者には意外な所に行ったりする。あ、もっと    念の為だけど、だからWordが良い。ってなことには絶対にならないです。    去年作ったWordの文章を今年読むのに苦労はするけど、10年前のテキスト    ファイルは今も何の問題もなく読めるよね。っていう教訓訓話なのですね。    某我が社ではWordの文章を10年保存するという決まりだが、紙に印刷してない    限り、5年もしたら読めるソフトなどどこにもないぞきっと。って思うってこと。    もちろん、印刷しろと言っている訳ではない。必要もないのに森林資源を浪費    してどうする[笑]。いかん。余談が長すぎ) 2. 連想記憶  ちょっち見逃していましたが、古代perlでも実現できていた(あたしゃ最近の  perl5は全然フォローしてません)機能がVBSにもあるようです。  どんな機能かというと「任意の文字列をインデックスにできる配列」です。って、  言っても分からないですよね。あっしもperl出始めの頃、分からなかったもの。  アルゴリズム的にはハッシュ表を使うのかな。perlはそうみたいだが。VBSは知らない  けど。  ええと。どういう奴かと言うとですね(うぅ。この説明だけで今回終わりそう)。  「緑の」→「たぬき」(どんべぇの方が個人的にはうまいと思うが - 主観)  「白馬の」→「王子」(王様が高齢で存命なら、おっさん王子ってのもありという     可能性はスレイヤーズ[某小説]で認識したが、某国の皇室も     そうなのよね。あ。こりゃ世が世ならあたしゃとっくに憲兵に     とっつかまって縛り首だな……)  「謎の円盤」→「UFO」(ってネタが通じない世代が台頭してるのも悲しいなぁ。       ストレイカー司令官の悲壮な程の「沈着冷静」が凄く       渋いんだけど。特に息子を死なせてしまう回とか……)  と、()内のゴミは除いて、何が「連想」なのかは何となく分かるかと思います。  で、これを通常のプログラミング言語でインプリメント(作る)とちょっと辛いことに  なります。  とかね。で、連想記憶(って、でもこの用語、VBSのぢゃない。perlの解説で出てきた  用語のはずな気がする。あ。VBScriptのヘルプによると関連配列と称するようです)  を使うとこんな風に書けますな。   Option Explicit Dim dic: Set dic = CreateObject("Scripting.Dictionary") Call dic.Add("母", "たらちね") ' 枕詞 Call dic.Add("いぬもあるけば", "ぼうにあたる") ' かるた Dim Q Do Q = InputBox("何が知りたいのかの?") If Q = "" Then Exit Do If dic.Exists(Q) Then Call MsgBox("それはのぅ、「" & dic.Item(Q) & "」じゃろう?") Else Call MsgBox("は?") End If Loop While True  .Addした最初の文字列がキー。つまりこいつで検索されるから重複は許されない。  次が値。というかデータ。データと言っても女性アンドロイドのことでは……。  (やめんか!ネタが分からない人にはおもしろくも何ともないではないか>わし)  う〜む。dic.Addしてる所だけ別ファイルにできれば、効率は悪い(だって実行の  度にデータベースを作りなおすわけだもん)だろうが、簡易なデータベースが  もしかしたらできるかもね。  そうそう。前に出したEval()を使うと辞書をチェインして、同じキーワードから  異なる結果を引き出すようなモノも作れますね。  RPGなどで、あるイベントをこなす前と後で同じ質問に対する村人の応答が  全く違うってのがこれで再現できる訳です(そうか?)。 === Option Explicit Dim dic: Set dic = CreateObject("Scripting.Dictionary") Call dic.Add("cat", "catdic") Call dic.Add("dog", "dogdic") Dim catdic: Set catdic = CreateObject("Scripting.Dictionary") Call catdic.Add("嬉しい", "ごろにゃ〜ん") Call catdic.Add("怒った", "フーッ!") Call catdic.Add("攻撃", "引っ掻く") Dim dogdic: Set dogdic = CreateObject("Scripting.Dictionary") Call dogdic.Add("嬉しい", "わわわんわん") Call dogdic.Add("怒った", "がるるるる") Call dogdic.Add("攻撃", "噛み付く") Dim Q, Q2, ev, s, i, k Do Q = InputBox("種族を選択?" & vbCrLf &_ "1. ねこ" & vbCrLf &_ "2. いぬ" & vbCrLf &_ "3. どっちもいや", "", "1") Select Case Q Case "1": Q = "cat" Case "2": Q = "dog" Case "": Exit Do Case Else Call MsgBox("わがままはだめよん"): Exit Do End Select Q2 = InputBox("「嬉しい」「怒った」「攻撃」より選択",_ "ナニをします?", "嬉しい") If Q2 = "" Then Exit Do ev = dic.Item(Q) & ".Item(" & Chr(&h22) & Q2 & Chr(&h22) & ")" MsgBox Eval(ev) 'Execute("MsgBox " & ev) Loop While True  ということで次。 (EOF)