WSH プログラミング - 基本操作

PROGRAM


WSH の基本環境。

目次

 

基本操作

WSH では、スクリプトに提供されるオブジェクトを操作する形で Windows へアクセスすることが出来るようになっています。

オブジェクトの中で特に重要となるのが "WScript" というオブジェクトで、これに実装されたプロパティやメソッドを利用することでスクリプトの制御を行います。他にも "WshArgument" や "WshShell" といった "WScript" の下位に位置するオブジェクトを利用したり、または任意の COM コンポーネントを利用することで、より多機能なスクリプトの記載が可能になります。

オブジェクトの操作に使用するスクリプトは、WSH 用のスクリプトであればなんでもいいのですが、標準では VBScript と JScript (JavaScript) の 2 つが利用できます。このどちらを利用するかは、"*.vbs" ならば VBScript が、"*.js" ならば JScript がというように、記述するスクリプトファイルの拡張子できまります。

 

なにはともあれ、どのようにスクリプトを組めばいいのか、簡単な例で見ていきましょう。

まずは画面に文字列を表示するスクリプトです。表示する文字は "テストメッセージ" とでもしましょう。WSH では、メッセージを表示する機能として、WScript オブジェクトが Echo というメソッドを持っています。

WScript.Echo [引数1, 引数2, ...]

WScript.Echo メソッドは、複数の引数を取り、それらを表示します。

これを VBScript スクリプトで書いてみると次のようになります。なお、WScript オブジェクトは既に "WScript" という名前で利用できるようになっているので、それをそのまま指定します。

# Echo を使って "テストメッセージ" を表示するスクリプト (VBScript)

WScript.Echo "テストメッセージ"

これを実行すると、"テストメッセージ" と表示されたダイアログボックスが画面に現れることと思います。

なお、Echo メソッドは引数を複数持つことができますけど、複数個のメッセージを与えた場合は半角空白をはさんでそれらが表示されるようです。また、引数をひとつも与えなかった場合は、空行として表示されます。

 

また、JScript でも同じことが可能です。

# Echo を使って "テストメッセージ" を表示するスクリプト (JScript)

WScript.Echo("テストメッセージ");

やっていること自体が短いのであまり違いが感じられないかもしれませんけど、要は JScript でスクリプトを書く場合は、JScript の構文で書く、また、オブジェクトの利用の仕方は VBScript と特に違わない、というところに気をつければ大丈夫です。

JScript ですから、イメージしやすく言うなら JavaScript ですから、引数は括弧でくくる、行末はセミコロンを付ける、という約束事をまもって Echo メソッドを呼び出しています。

 

さて、上記ではメッセージがダイアログボックスとして表示されていました。

ダイアログボックスでもいいのですけど、管理ツールなどを作成する場合は、スマートなコンソール出力 (コマンドプロンプトに文字が表示される) のほうが何かと便利な場合が多いです。

 

Echo でダイアログボックスが現れるのは、あくまでもディフォルトがそうなっているだけであって、少しの手間でディフォルトをコンソール出力に変更する事が出来ます。

やり方はコマンドプロンプトから、次の命令を実行します。

CScript //H:Cscript

これは WSH の既定スクリプトホストを "cscript.exe" に変更するというもので、こうすることで Echo はコンソール出力となります。今までのダイアログボックス表示だったのは、この既定スクリプトホストが "wscript.exe" であったためです。

この状態で先ほどのスクリプトを実行してみると、コンソールが起動してメッセージが表示されると思います。

もっとも、処理終了後にすぐに閉じてしまうため、実行の際にはコマンドプロンプトをあらかじめ起動して、そのスクリプトファイル名をそこへ入力して実行、という感じになります。

 

こうするとダイアログボックスが表示されなくなってしまう、訳ですが、あくまでも Echo の振る舞いが変わるだけであって、この状態でもダイアログボックスを使ったメッセージ表示を行うことが可能です。

それには "WshShell" オブジェクトが持っている Popup メソッドを使用します。

intButton = obj.Popup(strText, [nSecondsToWait], [strTitle], [nType])

細かいことはここでは省略しますが、この Popup メソッドに文字列を指定してあげることで、先ほどのようなメッセージボックスを表示させる事が可能です。ただし、Echo と違って表示用として渡せる文字列は1つだけなので、いくつもある場合はあらかじめ連結させておく必要があります。

これを使って書き直してみると、VBScript では次のようになります。

#### Popup を使って "テストメッセージ" を表示するスクリプト (VBScript)

 

Set shell = WScript.CreateObject("WScript.Shell")

shell.Popup "テストメッセージ"

 

Set shell = Nothing

少しややこしくなっているように見えますが、基本的には2行目の、"shell.Popup" という部分がその処理にあたります。

"WshShell" オブジェクトは、"WScript" のように最初から作成されているというわけではないので、使用する前にはまず WScript の CreateObject メソッドを使用して WshShell ( WScript.Shell ) を作成する必要があります。そして作成したものが、変数 shell に代入されますので、それの Popup を呼び出すという形になっています。

最後の行は、作成した shell の後始末です。特にしなくてもスクリプトの終了とともに削除されることと思いますけど、念のため自分で作って、使い終わったら片付けておきましょう。

 

それにしても、ディフォルトはコンソール出力のほうがいいと思うのは僕だけでしょうか。

普通に考えると、ダイアログを想定していたスクリプトをコンソールで実行してしまってもさほど気にならないですけど、逆にコンソールを想定していたスクリプトをダイアログで実行してしまうと、メッセージの多さに終わらせるだけで一苦労になりそうな気がします。

ましてや、コンソール版なら意図的にダイアログを表示できるわけですしね。

 

用意されているオブジェクト

さて、WSH にはどのようなオブジェクトが用意されているのでしょう。ここでは、どういうオブジェクトがあってそれがどんな役割を担っているのかについて触れてみようと思います。

 

WScript

WSH の最上位に位置づけられたオブジェクトです。WSH スクリプトはこのオブジェクトが提供する機能を利用することで、実効環境や引数などを取得したり、結果を出力したりする事が出来ます。

WSH スクリプトでは最初から WScript という名前でインスタンスが生成されるので、すぐに利用する事が出来ます。

このオブジェクトの中で多く利用されると思われるのが、他のオブジェクトを作成する "CreateObject" メソッド、メッセージを出力する "Echo" メソッド、引数を参照するための "Arguments" プロパティでしょうか。他にも "Quit" メソッドを使ってスクリプトを中断したり、"Sleep" メソッドで時間待ちをしたりもできます。

また、"cscript.exe" 環境では "StdIn" プロパティや "StdOut" プロパティが利用可能で、これらを利用することで簡単に標準入出力を取り扱うことが出来ます。

 

WScript.Arguments ( WshArguments )

WSH スクリプトを実行した際に与えられた引数を取得するためのオブジェクトです。WScript が既にインスタンスを "Arguments" プロパティに持っていますので、CreateObject メソッドで取得する必要はありません。

内容は "Length" プロパティで個数、"Item(n)" プロパティで値を、といった具合で取り扱えます。"Item" プロパティに指定する番号は 0 から始まるインデックスです。名前付き引数であれなかれ、"/" を含めた文字列で取得できます。空白をはさんで1つ、2つと認識しますが、引用符でくくられた空白混じりの文字列は1つとして取り扱われます。

また、"Named" プロパティと "Unnamed" プロパティの二つを持っていて、これらを利用することでそれぞれ、名前つきの引数と名前なしの引数を参照する事が可能です。

 

WScript.Arguments.Named ( WshNamed )

WSH スクリプトを実行した際に与えられた引数のうち、名前つきの引数を取得するためのオブジェクトです。WScript.Arguments が既にインスタンスを "Named" プロパティに持っていますので、Create Object メソッドで取得する必要はありません。

名前つき引数とは、コマンドラインにて /name:value という形で与えられた引数の事を指します。このとき Item("name") にて値を取り出すと、"value" という値を取得する事が出来ます。また、/name だけのものも、名前つき引数として取り扱われます。

他にも、"Exists" メソッドにてその名前の引数が与えられているかどうかを判定することも出来ます。Named プロパティ自体がコレクションになっていますので、VBScript の For Each を利用することで、与えられた名前付き引数を順次取得することも可能です。

 

WScript.Arguments.Unnamed ( WshUnnamed )

WSH スクリプトを実行した際に与えられた引数のうち、名前の付かない引数を取得するためのオブジェクトです。WScript.Arguments が既にインスタンスを "Unnamed" プロパティに持っていますので、Create Object メソッドで取得する必要はありません。

名前の付かない引数とは、"/" で始まらないものをさします。

 

WScript.Controller ( WshController )

リモートスクリプトを実行する環境を用意します。

このオブジェクトには "CreateScript" というメソッドが存在し、引数として、実行したいスクリプト名と、場合によっては実行するコンピュータ名を与えることで、そのスクリプトを操作するための WshRemote オブジェクトを取得する事が出来ます。実際の実行には、その WshRemote オブジェクトの "Execute" メソッドを実行します。

 

ということらしいのですが、Windows Server 2003 上で少し試してみようとしたのですけど CreateObject("WScript.Controller") の段階で、"WScript.Controller" というオートメーションが見つからないとのエラーになってしまいました…。

 

WScript.Controller.Remote ( WshRemote )

WScript.Controller オブジェクトの "CreateScript" メソッドによって作成します。

自分の環境では WScript.Controller の作成に失敗してしまう (見つからない) ため実験はしていないのですけど、動作の理屈としては、WshRemote オブジェクトを WScript.Controller.CreateScript メソッドで取得した後に WshRemote.Execute を実行し、WshRemote.Status が 0 (WshRunning) である間、すなわち実行中の間は適度に WScript.Sleep でも挟んだ While ループででも待って、 1 (WshFinished) になった時点でスクリプトの実行終了を示す処理を行う、という感じになるような気がします。

また、リモートスクリプトの開始や終了といったものは、イベントとしても通知されるようです。

たとえば Remote という名前で WshRemote オブジェクトを取得した場合は、Remote_Start() 関数が実行時に自動的に呼び出され、終了時には Remote_End() 関数が呼び出されます。また、エラーだった場合には Remote_Error() が呼び出されるようです。

 

このオブジェクトには、上記の "Status" プロパティや "Execute" メソッドのほかにも、いざというときにスクリプトを停止する "Terminate" メソッドや、エラーを知るための "Error" プロパティが用意されています。

 

WScript.Controller.Remote.RmoteError ( WshRemoteError )

WScript.Controller.Remote の "Error" プロパティが持っているオブジェクトです。

エラー番号を示す "Number" プロパティや、エラーメッセージを示す "Description" プロパティなどが用意されていて、これらを参照することでエラーの理由を確認する事が出来ます。

 

WScript.Network ( WshNetwork )

Windows ファイル共有やプリンタなどの接続を行うためのオブジェクトです。このオブジェクトを利用するためには、WScript.CreateObject("WScript.Network") を呼び出して、インスタンスを取得する必要があります。

"AddWindowsPrinterConnection" でネットワークプリンタを認識したり、"MapNetworkDrive" メソッドにてネットワークドライブの割り当てを行ったりします。

"ComputerName" プロパティや "UserDomain" プロパティ、"UserName" プロパティによって、コンピュータ名や所属ドメイン、ログオンユーザ名などを確認する事も出来るようです。

 

WScript.Shell ( WshShell )

Windows 寄りな高度な操作を行うための昨日が詰まったオブジェクトです。使用する際には WScript.CreateObject("WScript.Shell") にて、WshShell のインスタンスを生成する必要があります。

機能としてはポップアップメッセージ (ダイアログ) を表示したり、他のアプリケーションを操作したり、環境変数を参照したり、レジストリを操作したりといった事ができます。

 

いろいろとあるようですけど、ざっと紹介しますと…、環境変数を取得するための "Environment" プロパティ、Windows 特有のフォルダを取得する "SpecialFolders" プロパティ、レジストリを操作する "RegRead", "RegWrite", "RegDelete" メソッド、ポップアップダイアログを表示する "Popup"、他のファイルを実行する "Exec", "Run" メソッドでしょうか。

他にももう少し、いろいろなものが用意されています。

 

WScript.Shortcut ( WshShortcut )

Windows ショートカットを作成するためのオブジェクトです。このオブジェクトは WScript.CreateObject メソッドは使用せず、WScript オブジェクトの CreateShortcut メソッドの戻り値としてインスタンスを取得します。作成の際には、指定するファイル名の拡張子を LNK とします。

ショートカットの情報を設定するプロパティやメソッドが用意されていて、それらを適宜調整して "Save" メソッドを実行するという感じになるようです。

 

WScript.UrlShortcut ( WshUrlShortcut )

Web サイトへのショートカットを作成するためのオブジェクトです。このオブジェクトは WScript.CreateObject メソッドは使用せず、WScript オブジェクトの CreateShortcut メソッドの戻り値としてインスタンスを取得します。作成の際には、指定するファイル名の拡張子を URL とします。

ショートカットの情報を設定するプロパティやメソッドが用意されていて、それらを適宜調整して "Save" メソッドを実行するという感じになるようです。

 

WScript.Environment ( WshEnvironment )

環境変数へのアクセスを可能にするオブジェクトです。これは WScript.CreateObject メソッドは使用せずに、既に用意されている WScript.Environment プロパティを参照することで取得します。

コレクションなので VBScript の For Each で順次読み出すことが可能です。それ以外にも "item( )" プロパティを使用することで、指定した名前の環境変数値を取り出すことが出来ます。記録されている環境変数の個数は Length プロパティで確認できます。

 

WshSpecialFolders

Windows 固有の特殊フォルダを参照するためのオブジェクトです。WScript.CreateObject メソッドは使用せずに、WScript.SpecialFolders プロパティを参照することで取得します。

コレクションなので VBScript の For Each で順次読み出すことが可能です。"Item" メソッドに特殊フォルダ名を渡すことで、そのフォルダの実際のパスを取得する事が出来ます。

指定できる特殊フォルダ名は次のものがあるようです。

AllUsersDesktop 全ユーザ共通のデスクトップ
AllUsersStartMenu 全ユーザ共通のスタートメニュー
AllUsersPrograms 全ユーザ共通のプログラムフォルダ
AllUsersStartup 全ユーザ共通のスタートアップ
Desktop デスクトップフォルダ
Favorites お気に入りフォルダ
Fonts フォントフォルダ
MyDocuments マイドキュメントフォルダ
NetHood マイネットワークフォルダ
PrintHood
Programs プログラムフォルダ
Recent 最近使ったファイル
SendTo 右クリックの送るにリストアップされるショートカットが保存されているフォルダ
StartMenu スタートメニューフォルダ
Startup スタートアップフォルダ
Templates テンプレートフォルダ

 

WshScriptExec

WScript.Shell の Exec メソッドで実行したファイルの情報を取得し、そしてそれをコントロールするためのオブジェクトです。WScript.CreateObject メソッドにて生成するものではなく、WScript.Exec の戻り値として取得します。

"ProcessID" や "Status" プロパティのほか、呼び出したプログラムへの標準入出力も "StdIn", "StdOut", "StdErr" プロパティとして取得する事が出来ます。


[ もどる ]