Batch file to VBScript file (5) at 1998 Nov.13  うぅ。13日の金曜日だ。いつぞやはそれでも大安だったからまだしも……(おみゃーは 何教徒なんだ?とか言われそう) 3.4 実行  つまりはこういうことです: Set WshShell = Wscript.CreateObject("Wscript.Shell") WshShell.Run ("notepad c:\config.sys") WshShell.Run ("move /?")  ここで、"move/?"ってやるとエラーを喰らいます。DOSの時は"/"はきちんとデリミタ  として解釈されていた訳で、"move/?"で何の問題もなかったのに……。  とかいうのは無視して次に行くと(^^;。 WshShell.Run ("type c:\config.sys")  これはエラーになりますね。 WshShell.Run ("command /c type c:\config.sys")  こっちだとOK。だけどtypeがcommand.comの内部コマンドであることを知らないと  真相は永久に闇の中に(んな大げさな)なります。  で、NTだとcmd.exe (だっけ?)がコマンドインタプリタだから、きっと WshShell.Run ("cmd /c type c:\config.sys")  と、せねばならない気がします。難儀なことです。つまりNT (2000)と95/98で  同じ処理が書けない(%COMSPEC%を見れば良いかも)訳です。  ちなみにリダイレクト処理もコマンドインタプリタがやっているはずなので、 WshShell.Run ("command /c type c:\config.sys > c:\win95\desktop\tt.txt")  とかでOKっすね。DOS窓が出るのがアレですけど。  ところでデータファイルの実行はできないか?と思ってやってみるとできますね。 WshShell.Run ("c:\win95\desktop\mdm.txt")  こんな感じ。自動的に関連付けられたプログラムが起動する模様です。   こういう機能は、利用者から見ると便利。例えば.htmを起動した時にIEが動くのか  NN/NCが動くのか気にしないで済むから。   …ダウト。上の2行を読んで「そうだよなぁ」した人、後で職員室まで来るように  (って元ネタなんだったっけ?どうでも良いけど)。   データファイルの起動を掛ける前に、何が起動するのか、どのバージョンが起動  するのか、そもそも何かが起動するようになっているのか?ということを調べる  ようにしなけりゃプロの仕事ではないですね。   バッチみたいに「知りようがないも〜ん」ならば、えいやで起動掛けても問題ない  んですが(調べようがないからね)、なまじっか調べられる言語なのでチェックしてない  のを手抜きと言われたら返す言葉がないです。   …とは言え、んなことやってたら何時まで経ってもプログラムなぞ完成せん!  というのも事実。この辺りを分かっていてしっかりドキュメントに動作環境を明記  するのが最低限の義務ってものでしょう。>わし  #うぅぅ。手が思わず自分に対しリダイレクトを掛けているぅ。(自爆) 3.5 Copy/Move/Ren/Del/Attrib/タイムスタンプ他   この辺りになってくると、似て非なる言語で同一の処理をどう置き換えるのかを  説明しようという魂胆自体が間違っていた、と考えたくなってくる。   VBSも一応おぶじぇくとな作りになってますから、先ず対象が何かを考えないと  ならない訳でして: Driveオブジェクト : 1つのドライブ Drivesコレクション : そのマシンで使える全ドライブ Folderオブジェクト : 1つのフォルダ(ディレクトリ) Foldersコレクション : そのフォルダ内にある全フォルダ Fileオブジェクト : 1つのファイル Filesコレクション : そのフォルダ内にある全ファイル   ヘルプをつらつら見ると、xxコレクションって奴のプロパティには  Count (全部で幾つあるの?)というのがあり、っておい。Filesコレクションに  対してCountってやるとWin32エラーで落ちる! Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder("c:\dos") Set fc = f.Files For Each fl in fc s = s & fl.name : s = s & vbCrLf Next MsgBox fc.Count ' これがだめ   Drivesコレクションに対するCountは正常動作したから、これはやっぱりVBSの  蟲ですかね?まぁFor Each 〜 Nextで数、数えればそれで済むんですが……。   で、まぁCopy/Move/Delに関してはxxオブジェクトのメソッド、  Copy/Move/DeleteでOKOKですが、Renameはxxオブジェクトのプロパティを使用する  ようですね。で、ファイルをコピーしてリネームするのはこんな感じ。 Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFile("c:\win95\desktop\bat.vbs") f.Copy "C:\hoge.vbs" ' ここで既にリネームされてるけど(^^;; Set g = fs.GetFile("C:\hoge.vbs") g.Name = "foobar.vbs"   ということで、Copyの引数はフォルダでなくて直接ファイル名でもOKでした。   しかし。とことんめんどいんですけど?>VBS   ほんで、FileオブジェクトのプロパティにはAttribute、DataCreated、  DataLastAccessed、DataLastModifiedもありますね。日付関係は値を取ることしか  できないようなのでtouch.exeに相当する機能(*1)はVBSでは無理そうです。   ちなみにShortNameやPath、Sizeといったプロパティもありますねぇ。他にも  Typeというおもしろいプロパティも……。   Typeは拡張子に関連付けられた文字列を取ってくるようですね。例えば".TXT"  なら"テキスト文章"といった具合。おもしろいけど、余り役に立ちそうにないから  試さないけど。 (*1) ファイルのタイムスタンプ*だけ*を任意に変更するツール。そんなことをして  何が嬉しいかというと、最近良くあるでしょう?タイムスタンプがバージョンに  なっている奴。  …嘘です。本当はmake.exeというツール(MS製のはnmake.exe)と深く関わって来る  のですが、今は話題にしません。そういうツールなんだってだけの紹介のみして  おきます (EOF)