Lesson11 環境変数と特殊フォルダ
WshShellのオブジェクト2 -WshEnvironmentオブジェクト・WshSpecialFoldersオブジェクト-
今回は、WshShellのオブジェクトであるWshShortcutオブジェクト、WshUrlShortcutに引き続いて、WshEnvironmentオブジェクト、WshSpecialFoldersオブジェクトについて解説していきたいと思います。どちらも地味なオブジェクトですが、これから本格的なスクリプトを書く上で、補助的な役割を果たします。
ますはWshEnvironmentオブジェクトから見ていきましょう。
Dim WSHShell,WSHEnv,strList,strEnv Set WSHShell = WScript.CreateObject("WScript.Shell") Set WSHEnv = WshShell.Environment("PROCESS") '1.WshEnvironmentオブジェクトを作成 MsgBox "Windowsインストールフォルダは、" & WSHEnv.Item("windir") & "です。" '2.Windowsがインストールされているフォルダ名を表示 MsgBox "環境変数の総数は、" & WSHEnv.Count & "です。" '3.環境変数の総数を表示 strList="環境変数一覧は以下の通りです。" & vbCrLf For Each strEnv In WSHEnv '4.すべての環境変数を列挙 strList=strList & strEnv & vbCrLf Next MsgBox strList
WshEnvironmentオブジェクトを取得するには、1.のようにWshShellのEnvironmentプロパティの返値を用います。こうして作成されたWshEnvironmentオブジェクトには、環境変数の値が格納されています。
なお、この行を
Set WshEnv=WshShell.Environment
のように、Environmentプロパティの引数"PROCESS"を省略しても、同じ動作になります。この引数は、環境変数の種類を示す文字列(この場合「プロセス環境変数(すべての環境変数)」)ですが、Windows9xでは他の種類の環境変数が指定できないので、省略しても"PROCESS"として実行されるのです。(NTの場合については後ほど…)
ちなみに、どんな環境変数が定義されているかは、DOSプロンプトでsetコマンドを実行するとわかります。Windows9xでは、Autoexec.batにSet行を記述することで、環境変数を指定します。
2.では、Windowsがインストールされているフォルダのパスが入っている、windirという環境変数の値をItemプロパティによって表示しています。Itemプロパティには引数として環境変数名を指定することができます。もちろんItemプロパティが返すのは、引数として指定した名前に対する環境変数の値です。
Itemプロパティは、WshEnvironmentオブジェクトの既定プロパティなので、WSHEnv("windir")のようにプロパティを省略して記述すると、Itemプロパティの値が参照されます。つまり、WSHEnv.Item("windir")と同じ結果になるわけです。
3.ではCountプロパティによって環境変数の総数を取得しています。
WshEnvironmentオブジェクトのように、複数の項目を持つオブジェクトにはたいていItemプロパティ(既定)があり、そこに各項目の値が格納されています。また、多くの場合、項目の総数はCountプロパティで得られます。
すべての環境変数の値を取得するには、4.のようにFor Each...Nextステートメントを利用します。このステートメントは、Lesson4で配列の例とともに述べましたが、このような複数の項目を持つオブジェクトで、格納された各値を取得するのにも用いることができます。この場合、Iには"環境変数名=値"という文字列が入ります。ループは、Countプロパティと同じ回数だけ繰り返され、結果としてstrEnv変数には環境変数の一覧が代入されるわけです。
ところで、ある特定の環境変数の値のみが知りたい場合は、WshShellオブジェクトのExpandEnvironmentStringsメソッドを使う手もあります。2.を
MsgBox "Windowsインストールフォルダは、" & WSHShell.ExpandEnvironmentStrings("%windir%") & "です。"
のようにしても、同じ結果が得られます。(この場合は環境変数名を%で囲む必要があります。)
以上のように、Windows95/98では、Environmentプロパティに指定できる引数は"PROCESS"(プロセス環境変数;現在読み込まれているすべての環境変数。読み込み専用)だけですが、WindowsNT/2000ではそのほかに、"SYSTEM"(システム環境変数;すべてのユーザーに適用される)、"USER"(ユーザー環境変数;ユーザーごとに設定可能)、"VOLATILE"(揮発性環境変数;ログオフとともにクリアされる)の3つの引数が指定できます。
引数省略時は、"SYSTEM"になります。ただし、Administratorアカウントを持つユーザー以外は、引数に"SYSTEM"を指定、もしくは省略するとエラーになります。
また、デフォルトで定義されている環境変数自体のバリエーションもWin9xに比べて豊富です。たとえばNTでは、
Set WshShell = WScript.CreateObject("Wscript.Shell") Set WshEnv = WSHShell.Environment("PROCESS") MsgBox WSHEnv("NUMBER_OF_PROCESSORS")
のようにすると、稼働しているプロセッサの数が取得できます。
他にどのような環境変数があるか、このLessonの一番最初に記述したスクリプトで調べてみてはいかがでしょうか。この際、引数に"PROCESS"以外の"USER"、"SYSTEM"(Administratorのみ)、"VOLATILE"でも試してみてください。
次に、スクリプトからWindowsNT/2000の環境変数をセット(変更)・削除する方法を見てみましょう。
Set WshShell = WScript.CreateObject("WScript.Shell") Set WshEnv = WshShell.Environment("USER") WshEnv("test")="hoge" '1."test"という環境変数に、"hoge"という値をセット MsgBox "環境変数testを定義しました。" WshEnv.Remove "test" '2.test"という環境変数を削除 MsgBox "環境変数testを削除しました。"
1.WindowsNT/2000では、"USER"、"SYSTEM"(Administratorのみ)、"VOLATILE"のWshEnvironmentオブジェクトのItemプロパティに値を代入し、環境変数に値をセットすることができます。ここでは、testという名前のユーザー環境変数に、hogeという値をセットしています。
2.WindowsNT/2000では、環境変数を削除する、Removeメソッドが使用できます。削除したい環境変数名を引数として指定します。この場合、testという名前のユーザー環境変数を削除しています。ただし、"PROCESS"(プロセス環境変数)の場合は、削除できません。Administrator以外は、"SYSTEM"(システム環境変数)を削除することもできません。また、もちろん存在しない環境変数を削除しようとすると、エラーが発生します。
Windows2000の環境変数は、「システムのプロパティ」→「詳細」→「環境変数」で確認・作成・変更・削除が可能です。揮発性環境変数を含めた、すべての環境変数(プロセス環境変数)を確認するには、コマンドプロンプトでSetコマンドを実行することでも確認できます。
WshEnvironmentオブジェクトの詳細は、こちらを参照してください。
さあ、次はWshSpecialFoldersオブジェクトの方を見ていきましょう。
Dim WSHShell,WSHSfolder,strList,strFolder Set WSHShell = WScript.CreateObject("WScript.Shell") Set WSHSfolder = WSHShell.SpecialFolders '1.WshSpecialFoldersオブジェクトを作成 MsgBox "デスクトップフォルダは" & WSHSfolder.Item("Desktop") '2.デスクトップのフォルダ名を取得 For Each strFolder In WSHSfolder '3.すべての特殊フォルダのパスを取得 strList=strList & strFolder & vbCrLf Next MsgBox strList
WshSpecialFoldersオブジェクトには、特殊フォルダの場所が格納されています。
1.ではWSHShellのSpecialFoldersプロパティを用いて、WshSpecialFoldersオブジェクトを取得しています。
2.では、WshSpecialFoldersオブジェクトのItemプロパティで、"Desktop"という引数を指定して、デスクトップフォルダの場所を取得しています。
ItemプロパティはやはりWshSpecialFoldersオブジェクトの既定プロパティなので、省略して
MsgBox "デスクトップフォルダは" & WSHSfolder("Desktop")
と書いても同じです。また、
MsgBox WSHShell.SpecialFolders("Desktop")
として直接デスクトップの場所を表示することも可能です。どのように書いてもWshSpecialFoldersオブジェクトのItemプロパティの値を参照していることになります。
なお、WshSpecialFoldersオブジェクトにもCountプロパティがあり、特殊フォルダの種類の総数を取得することもできます。
3.ではFor Each...Nextステートメントですべての特殊フォルダのパスを取得しています。
WshSpecialFoldersオブジェクトのItemプロパティの引数には、下の表のように指定できます。
引数 | フォルダの種類 | 標準のパス |
AllUsersDesktop | すべてのユーザーに共通のデスクトップ(NT) | C:\WINDOWS\All Users\デスクトップ? |
AllUsersPrograms | すべてのユーザーに共通のプログラムメニュー(NT) | C:\WINDOWS\All Users\スタート メニュー\プログラム? |
AllUsersStartup | すべてのユーザーに共通のスタートアップ(NT) | C:\WINDOWS\All Users\スタート メニュー\プログラム\スタートアップ? |
Desktop | デスクトップ | C:\WINDOWS\デスクトップ |
Favorites | お気に入り | C:\WINDOWS\Favorites |
Fonts | フォント | C:\WINDOWS\FONTS |
MyDocuments | マイドキュメント | C:\My Documents |
NetHood | ? | C:\WINDOWS\NetHood |
PrintHood | ?(NT?) | ? |
Programs | プログラムメニュー | C:\WINDOWS\スタート メニュー\プログラム |
Recent | 最近使ったファイル | C:\WINDOWS\Recent |
SendTo | 送る | C:\WINDOWS\SendTo |
StartMenu | スタートメニュー | C:\WINDOWS\スタート メニュー |
Startup | スタートアップ | C:\WINDOWS\スタート メニュー\プログラム\スタートアップ |
Templates | 新規作成のテンプレート | C:\WINDOWS\ShellNew |
AppData | アプリ用のデータ(OutlookExpressのメールなど) | C:\WINDOWS\Application Data |
(NT)とあるのは、NT4.0でのみ利用できる引数です。Win9xでこれらの引数を指定すると、返値として長さ0の文字列""が返されます。(仕様書にはNULL値が返される、とあるのですがこれは嘘です。ところで、NULL値とは、無効な値という特別な値の一つです。)
この表にある特殊フォルダの場所は、WshSpecialFoldersオブジェクトを使わずに、WSHSHellのRegReadメソッドを利用しても取得することができます。特殊フォルダの場所は、レジストリのHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Foldersというキー以下に記されています。たとえばお気に入りの場所を取得するには、
MsgBox WSHShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellFolders\Favorites")
としてもOKです。逆に、たとえばHistoryフォルダ(履歴)など、レジストリから直に読むしかない特殊フォルダもあるくらいです。レジストリエディタでHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Foldersを見ていただくとわかると思います。
ところで、肝心のWindowsフォルダを取得するにはどうするかというと、これは先程述べた手法で、windirという環境変数を読み込めばいいわけです。
しかし、個人が自分のためだけにスクリプトを書くときには、特殊フォルダの名前は常に固定されているわけですから、WshSpecialFoldersオブジェクトの利用局面もそれほどないような気がしますね。
今回はWshShellのオブジェクトであるWshEnvironmentオブジェクト、WshSpecialFoldersオブジェクトについて述べました。これらのオブジェクトはともに「複数の項目を持つオブジェクト」という特徴を持っていることがおわかりいただけましたでしょうか?
次回はWScriptのオブジェクトに戻って、WshNetworkオブジェクト、WshArgumentsオブジェクトの解説をします。