WSH2.0の新機能

概要

 ここでは、WSHの新バージョンである、WSH2.0の新機能をまとめてみました。
 WSH2.0日本語版が公開されました(1999年11月)。WSH2.0は、Windows Script5.1に含まれています。ダウンロードは、ここからどうぞ。
 WSH2.0は、Internet Explorer5.01(5.0ではない)にも同梱されています。

 なお、WSH2.0にはHTMLヘルプが存在するので、一緒にダウンロードすると良いでしょう。

 WSH2.0ではいくつか機能増強がされています。2.0になって追加された機能をここで紹介していきたいと思います。

新機能

1.WSHオブジェクトモデルの新機能|2.スクリプティングランタイムの新機能|3.ドラッグアンドドロップのサポート|4.WSFファイルタイプの追加|5.コマンドラインオプションの追加

1.WSHオブジェクトモデルの新機能

・WScriptオブジェクト

 Sleepメソッドが追加され、任意時間のウェイトがコード中で記述できるようになりました。処理のタイミングを調整するときや、ループに利用できます。引数に、ウェイトする時間をmsec(ミリ秒;1/1000秒)で指定します。

 StdInプロパティStdOutプロパティStdErrプロパティが追加され、標準入力・標準出力・標準エラー出力が扱えるようになりました。ただし、wscript.exeでは値を参照することはできません(エラーが発生する)ので、cscript.exe(DOSプロンプト用)で実行します。また、標準入出力が扱えると言っても、DOSアプリの出力結果を直接読みとったりすることはできません。
 WSH2.0のオブジェクトモデルでは、スクリプティングランタイムのオブジェクトモデルが内部的に参照されているようです。WScriptオブジェクトのStdIn,StdOut,StdErrの各プロパティは、スクリプティングランタイムのTextStreamクラスに属するオブジェクトを返します。よって、標準入力・標準出力・標準エラー出力にTextStreamオブジェクトの各メソッド・プロパティが適用できるわけです。
 下のスクリプトは、右クリックメニューの、"Open With MS-DOS Prompt"から実行させてください。

 (例)

'まず、標準出力(DOS窓)に説明を書き込みます。
'ただ、WScript.StdOut.Writeの代わりにWScript.Echoを使った方がいいです。
WScript.StdOut.Write "任意の文字を入力してください。改行はEnterです。" & vbCrLf &  _
 "入力を終わるときはCtrl+Zを押します。" & vbCrLf & vbCrLf

Set tsi=WScript.StdIn '標準入力のTextStreamオブジェクトをtsiというオブジェクト変数に入れる。
str=tsi.ReadAll '標準入力の内容(=ユーザーが入力した文字列)をstrという変数に入れる。
line=tsi.Line '標準入力の現在の行数をlineという変数に入れる。
tsi.Close 'TextStreamオブジェクトを閉じる

WScript.Sleep 100 'ウェイトを0.1秒入れる。これを省略すると、次の表示がとぎれたりする…

Set tso=WScript.StdOut
tso.WriteBlankLines 2 '2行空行を挿入
tso.WriteLine "あなたが入力したのは下の文章です。" & " Lines=" & line '標準出力に一行書き込む
tso.WriteBlankLines 1
tso.WriteLine str '先ほど入力した文章を表示
tso.WriteBlankLines 1
tso.WriteLine "終了するにはEnterを押してください…"
tso.Close

str=WScript.StdIn.ReadLine '標準出力を読み、↑の表示がされないまま終了するのを防ぐ。

 BuildVersionプロパティ、Timeoutプロパティは、WSH1.0にもあったのでしょうか。もはや確認不能です。
 BuildVersionプロパティは、その名の通りWSHのビルドバージョンを返すようです(しかし何故か0を返してきますね?)。
 Timeoutプロパティは、実行中のスクリプトのタイムアウト(実行停止するまでの時間)を秒数で返します。ここで返されるのは、WSHファイル、//Tオプション、wscript.exeの設定で指定した秒数です。実際にはタイムアウトの指定がされていない場合でも、デフォルトの秒数(10)を返します。読みとり専用プロパティではありませんが、値を変更しても意味がありません。

・WshShellオブジェクト

 AppActivateメソッドSendKeysメソッドが追加されました。AppActivateは、任意のウィンドウをアクティブにするメソッドで、SendKeysは、アクティブウィンドウに任意のキーコードを送るメソッドです。
 これらのメソッドは本家VBではステートメントとして存在していましたが、VBSには省かれた(おそらくセキュリティーの配慮で)機能で、今回のWSHのオブジェクトのバージョンアップによって、新たにVBSからも利用できるようになりました。
 Windowsのアプリは、基本的にキーボードだけで操作できるようになっているので(守られていないアプリも多いが)、このメソッドを利用するとかなりいろいろな処理が可能になります。
 キーコードの指定の仕方は、WSH2.0のヘルプをご覧ください。

 (例)

'このスクリプトは、Outlook Express4を立ち上げ、「すべてダウンロード」を実行するスクリプトです。
'・ウィンドウタイトルに "Express"が含まれていること。また他に該当するウィンドウが表示されていないこと
'・起動時にダイヤルしない設定にしていること
'が条件です。(レジストリの設定を読み込むことでここら辺は調整可能ですが、本筋とはなれるのでここでは省略しました)
'ダウンロード後に切断するかどうかの設定はお好みで。
'キーコードを送るタイミングその他で、うまく動作しない可能性もあります。ご了承ください。
'また、OE5での動作は想定していません。

Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "C:\Progra~1\Outloo~1\msimn.exe" 'OEを立ち上げる。
WScript.Sleep 5000 '5秒ウェイトを入れ起動を待つ。適宜調整してください。
WSHShell.AppActivate "Express" 'タイトルが"Express"で終わるウィンドウを探し、それを前面に表示させる。
WScript.Sleep 100
WSHShell.SendKeys "^+M" 'Ctrl+Shift+MのキーコードをOutlook Expressのウィンドウに送る。「すべてダウンロード」のショートカットキーです。
WScript.Sleep 100
WSHShell.SendKeys "%Y" 'Alt+Yのキーコードを送る。オンラインに切り替えますか?というダイアログで「はい」を押す操作です。

 ConnectObjectメソッドは、CreateObjectメソッドにより作成されたオブジェクトに接続し、イベントを宣言します。下の例は、架空のProgID(nantoka.kantoka)を持つオブジェクトの場合です。

 (例)

Set X =WScript.CreateObject("nantoka.kantoka") 'オブジェクト作成
X.nantokamethod 'メソッドの実行
WScript.ConnectObject(X,"Event") 'イベントの宣言

Sub Event_nantokaevent(strNantoka) 'イベント
	msgbox strNantoka
End Sub

 ただし、CreateObjectメソッドの第二引数にプレフィックスを指定することでも宣言でき(詳しくは「オブジェクト解説」を見てください)、その違いがいまいちわかりません。また、InternetExplorerオブジェクトではバグのため、ConnectObjectメソッドを実行してもエラーが返されます。 

 LogEventメソッドは、 WSHでの実行ログをログファイルに記録するメソッドです。このメソッドを実行すると、Windowsフォルダのwsh.logファイルに、時刻と、引数として指定したログのタイプと、テキストが追記されます。NTの場合は、NTのイベントログに記録されるそうです。
 いちいちTextStreamオブジェクトを使わなくてもログが取れるというメリットがあります。
 ログのタイプ等についてはヘルプをご覧ください。
 以下は、スクリプトにエラー記録ルーチンを組み込む参考例です。

 (例)

On Error Resume Next
Set WSHShell = WScript.CreateObject("WScript.Shell")

...処理...

If Err.Number<>0 Then
	'エラーが発生した場合は、"Error"タイプを指定し、エラー情報を書き込む。
	WSHShell.LogEvent 1,Err.Source & "/" & Err.Number & "/" & Err.Description
Else
	'エラーが発生しなかった場合は、"Success"タイプを指定し、そのスクリプト名を書き込む。
	WSHShell.LogEvent 0,WScript.ScriptFullName
End If

・WshNetworkオブジェクト

 AddWindowsPrinterConnectionメソッドが追加されました。AddPrinterConnectionメソッドとの違いは、Windowsで認識されているプリンタ名でプリンタを指定できることだと思います。詳しくはヘルプをご覧ください。

2.スクリプティングランタイムの新機能

 GetFileVersionメソッドが追加され、ファイルバージョンが参照できるようになりました。

 (例)

Set Fs=WScript.CreateObject("Scripting.FileSystemObject")
msgbox Fs.GetFileVersion("c:\windows\explorer.exe")

3.ドラッグアンドドロップのサポート 

 VBS(VBE)、JS(JSE)、WSH、WSFファイル、およびこれらのショートカットに、ファイルのドラッグアンドドロップが可能になりました。これで引数にファイル名を指定するスクリプトが簡単に実行できるようになりますね。ようやくバッチファイルに追いついた感があります。

 この機能を利用すると、C:\Windows\Sendtoにスクリプトのショートカットを入れておくと、「送る」メニューに登録することも可能になります。

 なお、引数をスクリプト側から読みとるには、WScript.Argumentsを使います。詳しくはLessonなどを参照してください。

4.WSFファイルタイプの追加

 WSH2.0では.VBS、.JS、.WSHファイルの他に、.WSFファイルが追加されました。このファイルはXMLフォーマットで書かれたファイルで、いくつかの要素(エレメント)と呼ばれるタグから成り立っています。

 実際のWSFファイルの例は、WSH2.0のヘルプをご覧ください。

5.コマンドラインオプションの追加

 WSHの実行ファイルである、cscript.exeに新しいコマンドラインオプションが追加されました。また、wscript.exeでもcscript.exeと同じオプションが指定できるようになりました。(これは新機能ではなかったかも?)
 DOSプロンプトでcscript.exe //?と入力すると、オプションの一覧が表示されます。
 以下に、コマンドラインオプションの一覧を載せておきます。(太字がWSH2.0で追加されたオプションです)

オプション名 意味
//? コマンドラインオプションの一覧を表示。wscript.exeの場合はダイアログで表示されます。
//B バッチモードで実行。このオプションを指定すると、エラーメッセージが表示されなくなります。msgbox関数やpopupメソッドでのダイアログも表示されなくなり、そこでスクリプトの動作がストップしてしまうので注意。スクリプト側からは、WScriptオブジェクトのInteractiveプロパティが返す値によって判別できます。
//D アクティブデバッグが可能になる。スクリプトデバッガ(MSのサイトからダウンロード可能)がインストールされており、スクリプト中に"Stop"と記述されているとそこで実行が一時停止し、デバッグウィンドウが表示されます。
//E スクリプトエンジン名を指定。JScriptかVBScriptを指定します。
//E:VBScript のようにします。
//H デフォルトのスクリプティングホスト実行ファイルを指定します。
//H:WScript.exe (wscript.exeを指定。デフォルト)
//H:CScript.exe (cscript.exeを指定)
//I インタラクティブモードで実行。デフォルトのモードです。//Bオプションの反対の動作をします。
//Job WSFファイルに記述されたジョブを実行。<job id="JobName">というジョブを実行するには、//Job:JobName と指定します。
//Logo スクリプト実行時に、WSHのロゴを表示します。デフォルト。
//NoLogo スクリプト実行時に、WSHのロゴを表示しません。
//S 現在のコマンドラインオプションを保存します。このオプションをつけて実行すると、次からは他のオプションを指定しなくても有効になります。ただし、適用されるオプションは一部(//NoLogo,//Logo,//T)です。また、wscript.exeをオプションなしで実行させると、ダイアログから設定ができます。
//T タイムアウトの時間を秒数で指定。10秒後にスクリプトを停止させるには、//T:10 のようにします。スクリプト側からはWScriptオブジェクトのTimeOutプロパティで参照できます。
//X スクリプトをスクリプトデバッガ内で実行します。

Home