第12回 WshShellオブジェクトを利用する(1):基礎解説 演習方式で身につけるチェック式WSH超入門(1/2 ページ)
今回からはWShellオブジェクトについて解説する。最初は外部プログラムの起動や制御を行うRun、AppActivate、SendKeysメソッドについて解説。
今回から数回にわたって、WSH(Windows Script Host)の内部オブジェクトであるWshShellオブジェクトとそこから派生するオブジェクトについて解説していく。
WshShellオブジェクト
まずはWshShellオブジェクト(ProgIDは“WScript.Shell”)と、それから派生するオブジェクト群(WshEnvironmentオブジェクト、WshSpecialFoldersオブジェクト、WshShortcutオブジェクト、WshUrlShortcutオブジェクト、WshScriptExecオブジェクト)の階層構造とそれらのメンバ(プロパティ/メソッド)を図で概観してみよう。
WshShellオブジェクトのメンバと、それから派生するオブジェクトのメンバ
WshShellオブジェクト(ProgIDは“WScript.Shell”)をWScript.CreateObjectメソッドを使って生成すると、これだけのメンバ(プロパティ/メソッド)にアクセス可能である。4カ所の太くて短い赤矢印は、今回解説するメソッド。
このように、WshShellオブジェクトは、多数のオブジェクト、メンバを内包していることが分かる。今回からはWshShellオブジェクトのメンバを中心に解説し、次回以降に派生するオブジェクトとそのメンバの使い方について述べたいと思う。
アプリケーションを起動するRunメソッド
■連載目次
第1回 WSHを始めよう
第2回 VBScript基本(1)文字列の入出力
第3回 VBScript基本(2)計算と分岐処理
第4回 関数を使いこなす:文字列、数値、日付
第5回 データ型について理解を深めよう
第6回 VBScriptの配列を極める
第7回 Subプロシージャで処理を定義
第8回 Functionプロシージャで関数を定義
第9回 VBScriptのオブジェクトを使いこなす
第10回 WScriptオブジェクト(1)
第11回 WScriptオブジェクト(2)
第12回 WshShellオブジェクト(1)
第13回 WshShellオブジェクト(2)
第14回 WshShellオブジェクト(3)
第15回 WshNetworkオブジェクト
第16回 FileSystemObjectオブジェクト(1)
第17回 FileSystemObjectオブジェクト(2)
第18回 FileSystemObjectオブジェクト(3)
第19回 TextStream/Dictionaryオブジェクト
まずは、基本となる、WSHからのアプリケーション起動方法について述べる。WSHからアプリケーションを起動するにはRunメソッドとExecメソッドが使用できる。実行時にアプリケーションのウィンドウ・スタイルなどを指定可能なのがRunメソッド、実行中にオブジェクトを通じてアプリケーションと通信を行えるのがExecメソッドである。Runメソッドの方がより簡略にアプリケーションを実行可能だ。今回はこのRunメソッドについて見ていこう。
ここでは、Windows OSに付属する標準のテキスト・エディタである「メモ帳(実行ファイル名はnotepad.exe)」を起動する例を見てみよう。notepad.exeの存在するパスは環境によって異なるので適宜書き換えてもらいたい。
※ファイルRunNotepad.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
'メモ帳を起動。
objWshShell.Run "C:\Windows\System32\notepad.exe"
MsgBox "メモ帳を起動しました。"
Set objWshShell = Nothing
実行結果は例えば次のようになる。
このスクリプトでは、最初にWshShellオブジェクトをWScriptオブジェクトのCreateObjectメソッドで作成し、オブジェクト変数objWshShellに代入している。これでWshShellオブジェクトを利用可能になる。CreateObjectメソッドについての詳細は前回の「3.COMオブジェクトの操作(1)」を参照してもらいたい。
このようにRunメソッドは引数に実行ファイル(拡張子exeのファイル)のパスを記述すると、そのアプリケーションを実行する。
Runメソッドの引数は環境変数(% 〜 %で環境変数名をくくる)を展開するので、
objWshShell.Run "%windir%\system32\notepad.exe"
と書くこともできる。
なお、パスの通っているフォルダ(環境変数PATHにフォルダのフルパスが定義されているフォルダ)の実行ファイルを実行する場合、フォルダのフルパスは省略可能である。Windows XPやWindows Server 2003、Windows Vistaの32bitバージョン(x86)ではそれぞれC:\Windows\System32にパスが通っているので、
objWshShell.Run "notepad.exe"
と記述しても起動できる。また、スクリプトのあるフォルダにある実行ファイルも同じくフォルダ・パスは省略できる。カレント・ディレクトリにある実行ファイルも同様である(WSHからカレント・ディレクトリを設定する方法については後の回で述べる)。
実行ファイルのパスに半角スペースが含まれている場合は注意が必要だ。Runメソッドはそのような場合、実行ファイルのパスを ""(ダブル・クォーテーション記号)で囲む必要がある。すなわち、Internet Explorer(C:\Program Files\Internet Explorer\iexplore.exe)を起動するには、
objWshShell.Run """C:\Program Files\Internet Explorer\iexplore.exe"""
と書く必要がある。ちなみに、「"(ダブル・クォーテーション)」が3つ連続しているのは、"〜"の中では、" を記述するためには "" と重ねて記述しなければならないからである。
Runメソッドでは、実行ファイルに渡すオプションも指定可能だ。Internet Explorerをキオスク・モード(全画面表示)で起動するには「-k」オプションを付けるが、その場合は次のようになる。
objWshShell.Run """C:\Program Files\Internet Explorer\iexplore.exe"" -k"
なお、キオスク・モードで開いたInternet Explorerのウィンドウは[Alt]+[F4]キーで閉じることができる。
Runメソッドはエクスプローラの関連付けに従ってファイルを開くこともできる。例えば、スクリプトが存在するフォルダにある「test.txt」というファイルを開くには、
objWshShell.Run "test.txt"
のようにする。すると.txtファイルに関連付けされたエディタ(デフォルトではメモ帳)が起動し、test.txtを読み込んで表示する。
Runメソッドには前述のとおり、実行するアプリケーションのウィンドウ・スタイルを省略可能な第2引数に指定できる。例えば、
objWshShell.Run "notepad.exe",3
のように記述すると、メモ帳が最大化されて実行される。第2引数に指定できる数値は次の表のとおりである。なお、ウィンドウをアクティブにするかどうかも決定できる。
第2引数に与える数値 | ウィンドウ・スタイル | アクティブ・ウィンドウ |
---|---|---|
0 | 非表示 | そのまま(変わらない) |
1(省略時の値) | 通常サイズ | 起動したアプリケーション |
2 | 最小化 | 起動したアプリケーション |
3 | 最大化 | 起動したアプリケーション |
4 | 通常サイズ | そのまま(変わらない) |
5 | そのまま | 起動したアプリケーション |
7 | 最小化 | そのまま(変わらない) |
Runメソッドの第2引数 Runメソッドの第2引数の数値を変更すると、実行するアプリケーションのウィンドウ・スタイルを指定できる。ほかにも第2引数に与える数値は10まで定義されているのだが、筆者の環境では有意な差が認められなかったのでここでは省略している。 |
Runメソッドには、アプリケーションの終了を待つか否かを決めるために、Boolean値を取る省略可能な第3引数も存在する。省略時はFalseで、アプリケーションの終了を待たずにRunメソッドの次の行が実行される(非同期処理)。Trueを指定すると、アプリケーションが終了するまでスクリプトが待機する(同期処理)。例えば次のように記述する。
objWshShell.Run "notepad.exe",,True
この場合、メモ帳のウィンドウが立ち上がり、ユーザーがウィンドウを閉じると、(「メモ帳を起動しました。」という)メッセージ・ボックスが表示される。
なお、Runメソッドは終了コードを戻り値として返す(正常終了時は0)。
Copyright© Digital Advantage Corp. All Rights Reserved.