Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

今日の質問 : スクリプトからタイプ ライブラリにアクセスする方法はありますか


スクリプトからタイプ ライブラリにアクセスする方法はありますか

Q

Hey, Scripting Guy! スクリプトからタイプ ライブラリにアクセスする方法はありますか。

-- XA

A

XA さん、こんにちは。あまり詳しくない方のために説明すると、タイプ ライブラリとは COM オブジェクトの型情報が収められたファイル (コンポーネント) のことです。型情報は、オブジェクトとそれによって実行できる操作についての説明です。タイプ ライブラリには、オブジェクトが使用する定数などの情報が含まれています。たとえば、FileSystemObject には次の 3 つの定数とその値が定義されています。

Visual Basic
ForReading (1)
ForWriting (2)
ForAppending (8)
 

どういうことかというと、FileSystemObject を使用してテキスト ファイルにアクセスするときは、これらの定数のいずれかを参照する必要があるということです。たとえば、C:\Scripts\Test.doc というファイルを開き、そのファイルに現在の日付と時刻を書き込む場合は、次のようなスクリプトが必要です。

Visual Basic
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
    ("c:\scripts\test.txt", ForWriting)

objTextFile.WriteLine Now
objTextFile.Close
 

ここでは 2 つの点に注目してください。まず、ファイルを開くときには (OpenTextFile メソッドを使用します)、定数 ForWriting を指定します。これは、FileSystemObject に対し、読み取り、書き込み、追記のうち、どのモードでファイルを開くのかを指定する必要があるからです。もう 1 つの注目点は、最初の行で定数 ForWriting に値 2 を明示的に割り当てていることです。これは、VBScript がタイプ ライブラリにアクセスできないからです。そのため、スクリプトに対して ForWriting の値が 2 であることを示す必要があります。

それに対し、Visual Basic のようなプログラミング言語はタイプ ライブラリに直接アクセスすることができます。Visual Basic プログラムを作成する場合は、定数 ForWriting を定義して値 2 を割り当てる必要はありません。この定数を指定するだけで、Visual Basic がタイプ ライブラリにアクセスし、ForWriting の値を自動的に取得します。

つまり、プログラミング言語はタイプ ライブラリにアクセスできるので、ライブラリ内の定数を定義する必要はありません。それに対し、VBScript はタイプ ライブラリにアクセスできないため、スクリプトで使用する定数を手動で定義する必要があります (したがって、ADO を使用してデータベースを操作するスクリプトを作成する場合など、多くの定数の定義が必要となることもあります)。

おそらく、皆さんは今こう言っていることでしょう。「早く解決策を教えてほしいものだ。どうせもう用意できているのだろうから」そのとおりです。解決策は用意できています。ある程度は。従来の VBScript スクリプト (拡張子が .vbs) を作成したのでは、目標は達成できません。しかし、Windows スクリプト ファイル (拡張子が .wsf であるもの) を作成するのであれば、話は別です。

WSF ファイルは WSH 5.6 で初めて導入されましたが、はっきり言って、これまであまり存在感がありませんでした (詳細については、MSDN の WSF ドキュメントを参照してください)。WSF ファイルの問題点は、多くの場合、その長所 (タイプ ライブラリへのアクセスを提供することなど) よりも、スクリプトを大量の XML タグで取り囲む必要があるという短所の方が上回ってしまうことです。しかし、XML を扱うことが面倒ではなく、どうしてもタイプ ライブラリにアクセスしたいのであれば、次のようなコードを使用できます (このコードは .vbs ファイルではなく必ず .wsf ファイルとして保存してください)。

Visual Basic
<package>
    <job id="Test">
        <object id="objFSO" progid="Scripting.FileSystemObject"/>
         <reference object="Scripting.FileSystemObject" />
            <script language="VBScript">
                Set objTextFile = objFSO.OpenTextFile _
                    ("c:\scripts\test.txt", ForWriting)
                objTextFile.WriteLine Now
                objTextFile.Close   
            </script>
    </job>
</package>
 

一見すると変わったコードですが、それは WSF ファイルを見慣れていないからです。しかし、<script> タグの内側 (ここに VBScript コードを配置します) を見ると、始めに示したスクリプトとほとんど同じであることがわかります。異なるのは、FileSystemObject を作成するコードと定数 ForWriting を定義するコードがないことだけです。これらの操作は <object> タグと <reference> タグを使用して行っています。

通常の VBScript スクリプトであれば、次のようなコードを使用して FileSystemObject のインスタンスを作成します。

Visual Basic
Set objFSO = CreateObject("Scripting.FileSystemObject")
 

WSF ファイルでは、同じ操作を行うために <object> タグを使用します。

Visual Basic
<object id="objFSO" progid="Scripting.FileSystemObject"/>
 

オブジェクトに objFSO という ID を割り当てていることに注意してください。これは .vbs ファイルで使用したオブジェクト参照と同じです。

オブジェクト参照を作成すると、次のように <reference> タグを使用してタイプ ライブラリ (およびその内部に定義したすべての定数) にアクセスすることができます。

Visual Basic
<reference object="Scripting.FileSystemObject" />
 

これだけです。FileSystemObject 内のどのような定数でも参照することができます。その際、定数を定義する必要はありません。よくできていると思いませんか。もちろん、いつもこれほど簡単にできるわけではありません。オブジェクトと参照を作成するときに、ProgId ("Scripting.FileSystemObject" など) ではなく GUID を使用しなければならない場合もあります。ただ、少なくとも、このスクリプトはもっと複雑なスクリプトを作成するための足がかりにはなるはずです。