[PowerShell] | |||||||||
PowerShellからVBScript/JScriptのコードを利用する
|
|||||||||
|
解説 |
別稿「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をダウンロードするには、ここをクリックしてください。 |
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のプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトが保存されているものとする*)。
|
|
実行結果 |
ここでは、ScriptControl.ps1が出力するCodeObjectオブジェクトを取得し、このCodeObjectオブジェクトを介して、VBScriptで定義されたShowMessage関数を呼び出している。
上のように、指定した文字列に基づいてメッセージ・ボックスが表示されれば、スクリプトは正しく動作している。
*注意 |
PowerShellでスクリプト・ファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」を参照いただきたい。
|
より進んだ使い方
なお、上の例では、VBScriptのコードを、PowerShellスクリプト内にハード・コーディングしているが、(もちろん)ほかのスクリプト・ファイルに記述されたコードを動的に読み込むことも可能だ。例えば、あらかじめ用意されたSample.vbsをPowerShellから動的に実行したいなら、先ほどのScriptControl.ps1の以下の部分を次のように修正すればよい(Sample.vbsにはVBScriptで記述されたShowMessage関数が定義されているものとする)。
|
|
※修正したサンプル・ファイルScriptControl2.ps1をダウンロードするには、ここをクリックしてください。 |
Get-Contentコマンドレットは、指定されたファイルの内容を行単位に読み込み、文字列配列として返すPowerShell標準の命令である。またJoinメソッドはStringクラス(.NET Frameworkライブラリ)で提供される静的メソッドで、指定された配列の内容を指定された区切り文字(第1引数)で連結する。
つまり、ここではGet-Contentコマンドレットで読み込まれたSample.vbsの内容を、String::Joinメソッドで連結して、その結果を変数$progにセットしているというわけだ。これにより、Sample.vbsの内容がすべて変数$progに書き込まれる。
修正したスクリプトを手順2の要領で実行し、先ほどと同様の結果が得られれば成功だ。
この記事と関連性の高い別の記事
- PowerShellスクリプトへのショートカットを作成する(TIPS)
- PowerShellを使って指定したファイルをインターネットからダウンロードする(TIPS)
- PowerShellでレジストリ情報を操作する(TIPS)
- PowerShellでフォルダ/ファイル選択ボックスを利用する(TIPS)
- PowerShellで進ちょく状況をプログレス・バーで表示する(TIPS)
このリストは、デジタルアドバンテージが開発した自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
「Windows TIPS」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|