Batch file to VBScript file (6) at 1999 Jan. 07 3.6 ここは誰?わたしはどこ?   PC/AT系もプリインストールマシンが多くなった昨今、C:\Windowsだとか、  C:\Windows\デスクトップ (本当は半角)なんてものを決め打ちで指定しても  問題ないとか思ってないか?   逆に。海外のソフトを入れてAccessoriesとか、Startupとかいうエントリを  作られてしまって閉口したことはないか?   そう。そういう決め付けをしてはいけないのだ。ではVBSでごちょごちょいじくる  時にどんな情報が活用できるのかを見ていきたい。   …しかし。このペースだと人類滅亡(多分、1999の7の月)までには終わらないぞ。   ……だけどそこで人類が滅亡したら、この連載が終わってようがどーだろうが関係ない  *かも*しれない。という突っ込みは却下。  さてと。VBSの「特殊フォルダの定数」ってヘルプで見るとだな: WindowsFolder ; 普通、C:\Windows SystemFolder ; デフォルトは、C:\Windows\System TemporaryFolder ; ええと、C:\Windows\tempだっけか?  をぃ。と、思うだろう?肝心のフォルダがごっそり抜けている。で、もっと悪いことに、  私ゃこの定数をどう使うと何がどう得られるか知らなかったりする(^^;;  下に示すような方法を先に見付けちゃったから、深く追求しなかったんだが。 ★特殊フォルダを特定する Option Explicit Dim FN FN = GetSPF("DeskTop") Call MsgBox(FN) ' ------- ' Get Specidal folder name ' Function GetSPF(sName) Dim WshShell Set WshShell = Wscript.CreateObject("Wscript.Shell") GetSPF = WshShell.SpecialFolders(sName) End Function で、こいつの引数、sNameに入れる"DeskTop"とかはどこを参照すれば分かるかといえば: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders みたいなんだな(嘘かもしんないぞ)。 で、ありがたいかもしれないパス: DeskTop ; C:\Windows\デスクトップ Personal ; C:\My Documents Programs ; C:\Windows\スタートメニュー\Programs Recent ; C:\Windows\Recent SendTo ; C:\Windows\SendTo Start Menu ; C:\Windows\スタートメニュー Startup ; C:\Windows\スタートメニュー\Programs\スタートアップ #本当は半角カナだったり、うちの場合C:\Windowsなんてフォルダ自体が存在しない、とかいう  問題はあったりしますが、RegEditなり、実際にVBSで組んで確かめるなりして下さいね。  多分、デフォルトなインストールならこうだろう。という根拠薄弱な勝手な思い込みで  「;」以降は書いていたりします ★別のレジストリから読む方法: Option Explicit Const VENDER = "SGL00064" ' my Nifty ID Const APPNAME = "hogehoge" ' application name Dim DestDir DestDir = CreateDefaultPath(VENDER, APPNAME) Call MsgBox(DestDir) ' ------- ' Creating default install path ' Function CreateDefaultPath(sVender, sAppName) Dim sPath, WSH, fs Set WSH = WScript.CreateObject("WScript.Shell") Set fs = CreateObject("Scripting.FileSystemObject") sPath = WSH.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir") sPath = fs.BuildPath(sPath, sVender) CreateDefaultPath = fs.BuildPath(sPath, sAppName) End Function これを実行すると"C:\Program Files\SGL00064\hogehoge"が得られます。が、この CurrentVersionって所には他にも色々と情報があります。 レジストリのここから取れるパス(のうち、意味がありそうな奴。より詳細はRegEditを 起動して自分で確認してね) DevicePath ; C:\Windows\Inf OtherDecicePath ; C:\Windows\Inf\Other MediaPath ; C:\Windows\media ProgramFilesDir ; C:\Program Files SystemRoot ; C:\Windows ちなみに、レジストリのこの辺ってWin98とWin95とで微妙に違ってます。 例えば、Win98だとアクセサリのフォルダはどこ?という情報が取れますが、Win95では取れません。 また、Inf\Otherなんてフォルダ、OSR2より古いWin95では存在すらしてません。 特定のWinXXバージョンに依存し、他のバージョンのユーザを情け容赦なく切り捨てる覚悟が 必要です。さもなければ私のようにOSR1以前、OSR2、Win98と複数のWindowsマシンでテストする 羽目になります。実機で確認しないと動くかどうか分かったものではありませんからね。 ま、本気にやるならそれぞれIE3あり/なし、IE4あり/なし、Office95あり/なし、 Office97あり/なし、VBあり/なし……と果てしなくテスト環境は増えて行きます。もちろん、 これらの組み合わせ、つまりVB4 + IE4の場合、VC++5 +...な場合、と、正気の人間なら…… (…ここまで。いかん。愚痴だ) ★私はどこ?(自分自身はどこのフォルダにいるの?) Option Explicit Dim SrcDir SrcDir = GetThisDir() Call MsgBox(SrcDir) ' ------- ' Get Source folder ' Function GetThisDir() Dim sPath, i sPath = WScript.ScriptFullName i = InStrRev(sPath, WScript.ScriptName, -1, vbTextCompare) sPath = Left(sPath, i-1) If Right(sPath, 1) = "\" Then sPath = Left(sPath, i-2) GetThisDir = sPath End Function ここで、iがNULLになるかも(?)。もしその心配があるなら、If IsNull(i) Then ... ってやって対策して下さい。 今現在実行中のVBScriptはどこのフォルダで動いていますか?という情報を取る方法です。 ★DOSな環境変数から取ってくる Option Explicit Dim Env Env = GetEnv("winbootdir") Call MsgBox(Env) ' ------- ' Get Environment variable ' Function GetEnv(sEnv) Dim WshShell, WshEnv Set WshShell = Wscript.CreateObject("Wscript.Shell") Set WshEnv = WshShell.Environment GetEnv = WshEnv(sEnv) End Function …うちの場合は"C:\Win98"が返ってきました。ま、普通は"C:\Windows"でしょうが(^^;; #そのまま切り取って実行すれば動くはず……ですが、どうでしょう?全て確認済みの  コードです。ま、私の環境では動いた。ですけど %しかし。私、何やってんだろうね。この連載、誰かの役に立ってます?  何となく、どうせやるならgcc β20.1を入れてbashの使い方でもやる方が……。  もしくはWordやExcelに特化するとか、C++でWSHの制御をやってみるとか……。  Javaだってネイティブコンパイラが出てくるし……。  そもそもunixの方が伝統あるし、安定してる訳で……。  この間、ちょっと試したらXが正常に起動しなかったのでグレてるらしい↑(^^;;>私 (EOF)