Windows TIPS
[PowerShell]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

PowerShellからVBScript/JScriptのコードを利用する

解説をスキップして操作方法を読む

山田 祥寛
2008/02/29
対象OS
Windows PowerShell
VBScript/JScriptで記述されたコード資産を、PowerShellスクリプトに置き換えるのは手間である。
ScriptControlオブジェクトを利用すると、こうした旧来のコード資産をそのままPowerShellスクリプトから実行できる。

解説

 別稿「Windows PowerShellコマンド&スクリプティング入門」でも紹介したように、PowerShellは.NET Frameworkとも密接に連携した強力なスクリプティング環境を提供する。しかしだからといって、すべての人が無条件に旧来のWSH(Windows Script Host)からPowerShellに移行できるかといえば、なかなかそうもいかないだろう。その理由として、PowerShell(あるいは.NET Framework)という新しい環境を習得しなければならないこともあるが、それ以上に、旧来のコード資産をそうおいそれと捨てられないという理由も大きい。VBScript/JScriptで記述された多くのスクリプト・コードを、いま一度、PowerShellスクリプトで書き直さなければならないとしたら、二の足を踏む管理者は多いはずだ。

 しかし心配することはない。本稿で紹介するScriptControlオブジェクトを利用すれば、VBScript/JScriptで記述されたスクリプト資産を最低限の作業で、PowerShell上で動作させられる。ScriptControlは、任意のアプリケーション(例えばここではPowerShellスクリプト)からスクリプト・エンジンをホストできる軽量なCOMコンポーネントである。本稿では、このScriptControlを利用して、PowerShellスクリプトからVBScript/JScriptのコードを解析/実行する方法について紹介する。

操作方法

手順1――テキスト・エディタでPowerShellのコードを入力する

 まずはテキスト・エディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#〜」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントには、スクリプトの簡単な説明を入れておいた。

※ファイル:ScriptControl.ps1

# ScriptControlオブジェクトで実行するスクリプトを定義
$prog = '
  Function ShowMessage(ByVal msg)
    MsgBox(msg)
  End Function
'
# ScriptControlオブジェクトを生成
$ctrl = New-Object -ComObject ScriptControl
# 使用する言語を設定
$ctrl.Language = 'VBScript'
# スクリプト・コードを解析のうえで登録
$ctrl.AddCode($prog)
# 登録した関数を呼び出すためのCodeObjectオブジェクトを返す
$ctrl.CodeObject
サンプル・ファイルScriptControl.ps1をダウンロードするには、ここをクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体は何でも構わないが、ここでは「ScriptControl.ps1」という名前で保存しておこう。

 コード全体の流れについてはリスト内のコメントをご覧いただくとして、ここでは以下の点に注目してみる。

  • スクリプト・エンジンをホストするのはScriptControlオブジェクトの役割

 冒頭で述べたように、スクリプト・エンジンをホストするのはScriptControlオブジェクトの役割だ。ScriptControlのようなCOM(Component Object Model)ベースのコンポーネントをインスタンス化するには、New-Objectコマンドレットを使用すればよい。ただしCOMコンポーネントであることを表す-ComObjectオプションをコンポーネント名の前に指定する必要があるので、要注意だ。

 ScriptControlオブジェクトで利用可能なメンバは以下のとおりである。

メンバ 概要
[P]Language 使用するスクリプト言語(VBScript/JScriptなど)
[P]Timeout タイムアウト時間
[P]CodeObject 登録済みの関数を呼び出すためのCodeObjectオブジェクトの取得
[M]AddCode スクリプト・コードの解析/登録
[M]Eval スクリプト・コードの解析/実行
ScriptControlオブジェクトで利用可能な主なメンバ

 ここでは最低限、Languageプロパティで使用するスクリプト言語を、AddCodeメソッドでScriptControlオブジェクトに登録する関数を追加している。

 また、ScriptControlオブジェクトに登録した関数を呼び出すには、CodeObjectオブジェクト経由でアクセスする必要がある。CodeObjectオブジェクトを取得するには、ScriptControlオブジェクトのCodeObjectプロパティにアクセスすればよい。

手順2――PowerShellのスクリプト・コードを実行する

 ScriptControl.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトが保存されているものとする*)。

PS > $scr = ./ScriptControl.ps1
PS > $scr.ShowMessage("こんにちは、パワーシェル!")
実行結果

 ここでは、ScriptControl.ps1が出力するCodeObjectオブジェクトを取得し、このCodeObjectオブジェクトを介して、VBScriptで定義されたShowMessage関数を呼び出している。

 上のように、指定した文字列に基づいてメッセージ・ボックスが表示されれば、スクリプトは正しく動作している。

 *注意
PowerShellでスクリプト・ファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」を参照いただきたい。

より進んだ使い方

 なお、上の例では、VBScriptのコードを、PowerShellスクリプト内にハード・コーディングしているが、(もちろん)ほかのスクリプト・ファイルに記述されたコードを動的に読み込むことも可能だ。例えば、あらかじめ用意されたSample.vbsをPowerShellから動的に実行したいなら、先ほどのScriptControl.ps1の以下の部分を次のように修正すればよい(Sample.vbsにはVBScriptで記述されたShowMessage関数が定義されているものとする)。

$prog = '
  Function ShowMessage(ByVal msg)
    MsgBox(msg)
  End Function
'
   ↓この部分を次のように修正する

$prog = [String]::Join("", (Get-Content Sample.vbs))
修正したサンプル・ファイルScriptControl2.ps1をダウンロードするには、ここをクリックしてください。

 Get-Contentコマンドレットは、指定されたファイルの内容を行単位に読み込み、文字列配列として返すPowerShell標準の命令である。またJoinメソッドはStringクラス(.NET Frameworkライブラリ)で提供される静的メソッドで、指定された配列の内容を指定された区切り文字(第1引数)で連結する。

 つまり、ここではGet-Contentコマンドレットで読み込まれたSample.vbsの内容を、String::Joinメソッドで連結して、その結果を変数$progにセットしているというわけだ。これにより、Sample.vbsの内容がすべて変数$progに書き込まれる。

 修正したスクリプトを手順2の要領で実行し、先ほどと同様の結果が得られれば成功だ。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間