GO BACK

Windows Scripting Host教室 その2


「WSHのオブジェクトを使う」



■WSHのオブジェクトとは?


 さて、一応簡単な命令を実行して計算などを行なうことはできるようになりましたが、これらはWSHというより「VBScript」というスクリプト言語の機能といってよいでしょう。VBScriptだけでは、ファイルをコピーしたりフォルダを作ったりといったWindowsの機能を利用したスクリプトを作ることはできません。

 では、こうした機能はどうやれば利用できるのか。それは「そのためのオブジェクトを作る」のです。――「オブジェクト」というのは、ある「もの」を操作するのに必要なさまざまな命令や値などをひとまとめにしてある部品、といえばよいでしょう。ある「もの」とは、例えばファイルであったり、フォルダであったり、開いているウィンドウであったり、起動しているアプリケーションであったりと様々です。

例えば、あるファイルをコピーしたければ、そのファイルのオブジェクトを作成し、そこに用意されているコピー命令を実行すると、ファイルがコピーされます。あるフォルダのオブジェクトを作成し、それの削除命令を実行すれば、そのフォルダが削除されます。――このように、まず操作したい「もの」のオブジェクトを作り、そこにある命令を実行することで、Windowsのファイルやアプリケーションを操作するのですね。

 オブジェクトは、1つ1つが単独で用意されているわけではなく、あるオブジェクトの中に別のオブジェクトを作る命令があったり、別の「もの」をオブジェクトとして取り出す命令が用意されていたりします。また、「ファイル」「フォルダ」というように具体的なものばかりでなく、「ファイル全般の機能そのもの」とか「Windowsのシステム全体」というようにやや抽象的なオブジェクト、「そこにあるファイル全部」というようにいくつもの要素をまとめて扱うオブジェクトなど、さまざまなものがあります。

 オブジェクトを作成する時は、

	Set 《変数》 = CreateObject("《プログラムID》")

――このような形で実行をします。これで、指定したオブジェクトが《変数》に割り付けられます。この「CreateObject」という命令が、オブジェクトを作成するためのものなのです。この命令は、作成したオブジェクトを返す、関数のような働きをするので、このように変数に値を代入するような形で書きます。ただし普通の値と違い、オブジェクトの場合は「Set」というのを頭につけて書くことになっています。これはつい忘れがちですから注意しましょう。

 また、値を返す命令は、InputBoxなどと同様に()で括ってそのあとにパラメータを記述することになっています。これも()を忘れると動きませんから注意してください。

 後ろの方にある《プログラムID》というのは、オブジェクトを指定するのに使う名前のようなものと考えて下さい。――Windowsでは、こうしたオブジェクト類はその「設計図」のようなものがライブラリとして用意されており、クラス作成時には「この設計図を元に作ってください」ということを指定しないといけません。この「オブジェクトの指定」に必要なのが《プログラムID》です。

 プログラムIDは、あらかじめ「このプログラムIDでこのオブジェクトができる」ということがWindowsのシステムに登録されています。ですから、「このオブジェクトを使いたい時は、このプログラムIDを指定する」ということだけ覚えておけば、オブジェクトを作るのは割と簡単ですよ。



■ファイル操作の基本オブジェクト


 では、実際にオブジェクトを操作してみましょう。まずは、もっとも利用価値の高いものとして「ファイルを操作するためのオブジェクト」から説明しましょう。

 ファイルを操作するにはさまざまなやり方がありますが、もっとも簡単なのは「ファイル操作」のオブジェクトを作り、そこにある命令を実行することです。WSHでは、ファイル操作そのものを示すオブジェクトがあります。これは「FileSystemObject」というものです。

	Set 《変数》 = CreateObject("Scripting.FileSystemObject")

 このように実行すると、FileSystemObjectのオブジェクトが作成できます。後は、このFileSystemObjectに用意されているファイルの操作命令を実行すれば、ファイルをコピーしたり移動したり削除したり自由に行えるようになります。では、簡単な例をあげましょう。

Set FS = CreateObject("Scripting.FileSystemObject")
FS.CopyFile "c:Autoexec.bat","c:My Documents"

 これは、Cドライブのルートにある「Autoexec.bat」ファイルを、Cドライブの「My Documents」フォルダにコピーするスクリプトです。たった2行の簡単なものですね。

 まず「Set FS = CreateObject("Scripting.FileSystemObject")」と実行して、変数FSにFileSystemObjectオブジェクトを割り付けます。これで、FSはオブジェクトとして扱えるようになります。

 そして、その次の「FS.CopyFile "c:Autoexec.bat","c:My Documents"」というのが、コピー命令を実行しているところです。オブジェクトに用意されている命令を実行するには、「《オブジェクト》.《命令》」というように、オブジェクト名(というか、オブジェクトを割り付けた変数名)と、使いたい命令をピリオドでつなげて記述します。

 命令の中には、実行する時に様々な値を一緒に渡してやらないといけないものもあります。例えば、先に登場したMsgBoxは、表示するテキストを1つ渡してやる必要がありましたね? オブジェクトの命令もやはり同じで、必要な値がある場合は、その後に続けて記述します。今回使った「CopyFile」は、2つの値を渡してやることになっています。

	《FileSystemObject》.CopyFile 《コピー元のパス》,《コピー先のパス》

 このように、コピーするファイルと、どこにコピーするかという2つの値をカンマでつなげて書くのです。それぞれの値は、「c:\ …」というようにMS-DOSのパス指定と同じ書き方をしたテキストになります。

 このコピー命令「CopyFile」の他にも、ファイルの移動、削除といった命令、更にフォルダのコピー、移動、削除のための命令などがFileSystemObjectオブジェクトにはあります。ざっと整理しておきましょう。

・ファイルのコピー
《FileSystemObject》.CopyFile 《コピー元のパス》,《コピー先のパス》

・ファイルの移動
《FileSystemObject》.MoveFile 《移動元のパス》,《移動先のパス》

・ファイルの削除
《FileSystemObject》.DeleteFile 《ファイルのパス》

・フォルダのコピー
《FileSystemObject》.CopyFolder 《コピー元のパス》,《コピー先のパス》

・フォルダの移動
《FileSystemObject》.MoveFolder 《移動元のパス》,《移動先のパス》

・フォルダの削除
《FileSystemObject》.DeleteFolder 《フォルダのパス》
 ファイルもフォルダもだいたい同じような書き方、使い方ですから、それほど難しくはないでしょう。注意して欲しいのは、削除関係のものです。これは一度実行するとその場でファイルやフォルダを丸ごと削除してしまい、元に戻すことはできません。ですから、利用は慎重に行なうようにしてください。



■ファイルのオブジェクトを取り出す


 このFileSystemObjectは、ごく単純にファイルをコピーしたり削除したりするのに重宝するものです。が、ファイルやフォルダの状態を調べたり、もっときめ細かな操作を行なうには、用意されている機能がやや大雑把すぎます。こうした場合は、ファイルやフォルダそのものを示すオブジェクトを取り出して操作する必要があります。

 まずは、ファイルを取り出してその状態を調べてみましょう。ファイルのオブジェクトを得るには、FileSystemObjectオブジェクトにある「GetFile」という命令を使います。これは、こんな形で利用します。

	Set 《変数》 = 《FileSystemObject》.GetFile(《ファイルのパス》)

 これで、《変数》に指定したファイルそのものを示すオブジェクト(「Fileオブジェクト」と呼ぶことにしましょう)が割り付けられます。このFileオブジェクトには、ファイルのさまざまな性質を示す値や、ファイルを操作する命令などがまとめて用意されていいます。

 では、簡単なスクリプトを作ってみましょう。先ほどと同じく、Autoexec.batファイルを調べてみることにします。

Set FS = CreateObject("Scripting.FileSystemObject")
Set F = FS.GetFile("c:Autoexec.bat")
str = "ファイル名:" & F.ShortName & vbCrLf
str = str & "最終アクセス:" & F.DateLastAccessed & vbCrLf
str = str & "最終変更:" & F.DateLastModified & vbCrLf
str = str & "サイズ:" & F.Size
MsgBox str


 これを実行すると、画面にAutoexec.batファイルのファイル名、最終アクセス、最終変更、サイズが表示されます。ファイルの状態がスクリプトで調べられていることがわかりますね?

 スクリプトをよく見ると、FileSystemObjectオブジェクトを作成した後、「Set F = FS.GetFile("c:Autoexec.bat")」という命令でAutoexec.batのFileオブジェクトを作成し、Fという変数に割り付けていることがわかります。

 そして、その後に「F.ShortName」「F.DateLastAccessed」「F.DateLastModified」「F.Size」といったものが変数strに収められていっているのがわかりますね。これらは、Fileオブジェクトに用意されている「プロパティ」というものです。

 プロパティというのは、現在のオブジェクトの状態を示す様々な値のことです。このプロパティの値を取り出したり、あるいは変更したりすることで、オブジェクトを調べたり操作したりできるのです。

 プロパティも、オブジェクトの命令などと同様に「《オブジェクト》.《プロパティ》」という形で記述します。今回使ったプロパティは、それぞれ以下のような値を示すものです。

ShortName――MS-DOS表記のファイル名
DateLastAccessed――最終アクセス日時
DateLastModified――最終変更日時
Size――ファイルサイズ

 これらは、値を得るだけで、書き換えたりすることはできません。それはそうですよね、最終変更日なんかが勝手に変更できたら意味がありませんから。けれど、プロパティの中には、値を読み取るだけでなく変更できるものもあったりします。プロパティによってそれは異なるのです。

 それともう1つ「vbCrLf」というのも説明しておきましょう。これは、改行コードを示すVBScriptの定数なのです。2つのテキストを改行して1つにつなぎたい場合、間にこのvbCrLfというものを&ではさめばいいんですね。これは多用しますから覚えておきましょう。



■ファイルのオブジェクトを取り出す


 Fileオブジェクトにはこの他にもたくさんのプロパティがありますが、とりあえず他のものは置いておいて、今度はフォルダを示すオブジェクト(Folderオブジェクトと呼びましょう)を使ったサンプルを作ってみましょう。

Set FS = CreateObject("Scripting.FileSystemObject")
Set F = FS.GetFolder("c:Windows")
str = "フォルダ名:" & F.ShortName & vbCrLf
str = str & "作成日:" & F.DateCreated & vbCrLf
str = str & "ドライブ:" & F.Drive & vbCrLf
str = str & "サイズ:" & F.Size
MsgBox str


 これはCドライブの「Windows」フォルダの名前、作成日、ドライブ名、サイズを表示するスクリプトです。Fileオブジェクトで使ったのと同じプロパティじゃ面白くないですから、他のものを表示させてみました。

 Folderオブジェクトを得るのは、FileSystemObjectの「GetFolder」という命令を使います。これはGetFileと使い方は同じですからわかりますね? そしてその後で、やっぱりプロパティを変数に取り出しています。今回新たに使ったのは以下のものです。

DateCreated――作成日
Drive――フォルダ(ファイル)があるドライブ

 これらのプロパティは、FolderだけでなくFileオブジェクトでも使えます。また、先に登場したプロパティも、FileだけでなくFolderでも利用可能です。FileとFolderでは、命令もプロパティも共通したものが多いんですね。

 というわけで、ファイルやフォルダを扱うためのオブジェクトと命令、そして主なプロパティについてざっと説明しました。これだけで、ファイル関係の処理を行なうスクリプトは作成することができます。今回は直接調べるファイルやフォルダのパスをテキストで指定しましたが、InputBoxなどを使ってユーザーに入力してもらうようにすれば、もっと汎用性の高いスクリプトが作れます。

Set FS = CreateObject("Scripting.FileSystemObject")
FPath = InputBox("フォルダのパスを入力:")
Set F = FS.GetFolder(FPath)
str = "フォルダ名:" & F.ShortName & vbCrLf
str = str & "作成日:" & F.DateCreated & vbCrLf
str = str & "最終変更:" & F.DateLastModified & vbCrLf
str = str & "サイズ:" & F.Size
MsgBox str


 例えば、こんな具合です。これで、特定のファイルやフォルダの情報を表示させるスクリプトができますね。またFileSystemObjectの命令と組み合わせれば、ユーザーの入力したファイルやフォルダをコピーしたり削除するようなスクリプトも作れるでしょう。

 これらのファイル/フォルダ関係のオブジェクトを使って、「オブジェクトを操作する」ということに慣れておくとよいでしょう。WSHは、いかにオブジェクトをうまく使いこなすかが習得のカギなのです。


GO NEXT


GO HOME