PerlでWSH

この文章は、Active Perlに同梱されているhtmlファイルの「Windows Script Host」の中から、個人的に参考にしようと思った部分を抜き出して日本語でまとめ、さらに加筆修正を加えたものです。スクリプトのサンプルは、ここにあります。



ウインドウズ・スクリプト・ホスト(WSH)はPerlScriptのようなActiveXスクリプティングエンジンのためのスクリプトを書くホストです。ホストとして、WSHによってコマンドラインから、またウィンドウズ上でスクリプト実行させることができます。

また、同じファイルの中で複数のスクリプト言語を記述することができ、複数のスクリプトエンジンを使って、実行させることができます。

WSHファイルは、そのmarkup言語としてXMLを使うことができます。 たとえば、「HelloWorld!」と表示するには、
<Job ID="HelloWorld">
<script language=PerlScript>
  $WScript->Echo("Hello World!");
</script>
</Job>
このようにWSHファイルを記述します。

XMLのタグ<Job>でIDを定義し、<script>でPerlScriptを使うスクリプト言語として定義するという形式です。実行すると、ウインドウに"Hello World!"のメッセージボックスが表示されます。

WScript Object

主なメソッドは、以下のとおりです。

$Wscript->Echo(Arg1, Arg2, Arg3, …);

     ※Arg1, Arg2, Arg3 ... は、表示するアイテムのリストです。

WSHによって定義される標準の出力に、テキストを出力します。表示アイテムは、1 つの空白で区切られます。

$WScript->GetObject(Pathname [,ProgID] [,Prefix ]);



指定された ProgID を持つ既存のオブジェクトを取得するか、ファイルを読み込んで新しいオブジェクトを作成します。

$WScript->Quit([$int_errorcode]);



処理を止めて、任意のエラーコードに応じたエラーを出力します。

$WScript->Sleep($int_milliseconds);



指定された時間(単位:1/100秒)スクリプトの実行を停止します。

$WScript->{Application};



WScript対象の上でIDispatchインタフェースを提供します。

$WScript->{Arguments};



WshArguments オブジェクト (引数のコレクション) を返します。

$WScript->{Fullname};



ホスト実行可能ファイルまたはshortcut objectへのフルパスを返します。

$WScript->{Name};



WScript objectの名前(wscript.exe または cscript.exe)を返します。

$WScript->{Path};



WScript.exeまたはCScript.exeが存在するフォルダのパスを返します。

$WScript->{Scriptfullname};



実行中スクリプトのフルパスを返します。

$WScript->{Scriptname};



実行中スクリプトのファイル名を返します。

$WScript->{StdError};



実行中スクリプトのエラー出力を得ます。
DOSプロンプト用。

$WScript->{StdIn};



実行中スクリプトに、入力を与えます。
DOSプロンプト用。

WScript->{StdOut};



実行中スクリプトの標準出力を得ます。
DOSプロンプト用。

$WScript->{Version};



WScriptホストのバージョンを返します。

The WShShell Object

WScriptオブジェクトでWshShellオブジェクトを作成することで、ローカルでのプログラム実行、レジストリ内容の操作、ショートカットの作成、システム フォルダへのアクセスなどを行うことができるようになります。

$WshShell = $WScript->CreateObject("WScript.Shell")



WshShellオブジェクトで行える面白いメソッドのひとつに、ウィンドウをアクティブにする能力およびタイトルバーにタイトルを入れることがあります。これは、パラメーターとして実行中ウィンドウのタイトルバーのタイトルを備えた(一方の)AppActivateを呼ぶことにより、あるいはパラメーターとしてタスクIDを使用することにより行われます。

<Job Id="WshShell">
<script language=PerlScript>
  $WshShell = $WScript->CreateObject("WScript.Shell");
  $WshShell->Run("notepad");
  $WshShell->AppActivate("Untitled - Notepad");

  my $message = "Hello from PerlScript!\n";

  for($i=0; $i < length($message); $i++) {
    $char = substr($message, $i, 1);
    $WScript->Sleep(100);
    $WshShell->SendKeys($char);
  }
</script>
</job>

SendKeysメソッドはキーボードから入力したときのように、1 つ以上のキーストロークをアクティブなウィンドウに送ります。

$WshShell->Run(Command [,WindowStyle ] [,WaitOnReturn ]);



Runメソッドは、新しいプロセス内でプログラムの実行を開始します。WindowStyleは、0から10までの間の整数の値をとり、WaitOnReturnはブール値をとります。スクリプト内の次の処理に進ませず、プログラムの実行が終了するまでスクリプトを待機させることもできます。

・Special Folders


WshShellオブジェクトは、さらにデスクトップ、スタート・メニューおよびマイドキュメントのような特別なフォルダのパスを、WshSpecialFoldersオブジェクトで返すことができます。

<Job Id="SpecialFolder">
<script language=PerlScript>
  $WshShell = $WScript->CreateObject("WScript.Shell");
  $numFolders = $WshShell->SpecialFolders->{Count};
  $title = "PerlScript & WSH Example";
  $style = 1;

  for($i=0; $i<$numFolders; $i++) {
    $ok_or_cancel = $WshShell->Popup(
      $WshShell->SpecialFolders($i),
      undef,
      $title,
      $style);

    exit if ($ok_or_cancel == 2);
  }
</script>
</job>

・Working With the Registry


WshShellオブジェクトはレジストリ操作のための機能を提供します。このため、RegRead、RegWriteおよびRegDeleteの3つのメソッドがあります。レジストリにアクセスする際、ルートキーについては省略して利用することができます。たとえば、本来は

HKEY_CURRENT_USER\ScrtipeEngine\Val



というレジストリキーを、

HKCU\ScriptEngine\Val



という指定でアクセスすることができます。
RegReadメソッドは次のデータ・タイプを扱います。

  REG_SZ
  REG_EXPAND_SZ
  REG_DWORD
  REG_BINARY
  REG_MULTI_SZ

RegWriteは、特別な2、3のパラメータを必要とします。

$WshShell->RegWrite(Name, Value [,Type]);



新しいキーの作成、新しい値名の既存キーへの追加 (および値の設定)、既存の値名の値変更などを行います。Nameの最後にバックスラッシュをつければキー名の指定になり、つけなければ値名の指定になります。Typeパラメーターはオプションです。使用する場合は、次のデータ・タイプのうちの1つを指定します。

  REG_SZ 文字列
  REG_EXPAND_SZ 文字列
  REG_DWORD 整数
  REG_BINARY 文字列

・Miscellanous


メッセージボックスを表示させる例です。

$retval = $WshShell->Popup(Text, [SecondsWait], [Title], [Type]);



Popupメソッドは、あなたがメッセージボックスを二者択一で定義することを可能にします。ウィンドウを閉じる前に待つ秒、ウィンドウのタイトル、さらには利用可能なボタンのタイプなども指定でき、次のように定義されます。

  0 (Ok)
  1 (Ok and Cancel)
  2 (Abort, Retry, and Ignore)
  3 (Yes, No, and Cancel)
  4 (Yes and No)
  5 (Retry and Cancel)

値はまた、アイコンと組み合わせることができます。

  16 (Stop Mark)
  32 (Question Mark)
  48 (Exclamation Mark)
  64 (Information Mark)

返り値で、どのボタンが押されたか示します。値は下記のうちの1つになります。

  1 (OK)
  2 (Cancel)
  3 (Abort)
  4 (Retry)
  5 (Ignore)
  6 (Yes)
  7 (No)

XML Element Reference

ウインドウズ・スクリプト・コンポーネントのように、ウインドウズ・スクリプト・ホストは、展開することができる1セットのXML要素を持っています。それらがどのように使用されるかについての基礎的な理解に関しては、ウインドウズ・スクリプト・コンポーネントに関するセクションを参照してください。

・The Job Element


Job elementは、始めおよびコンポーネントの終了を定義するために使用されます。それは他のすべてのタグをカプセルに入れます。

万一あなたのWSHファイルが1つを越えるJobを含んでいれば、<package>element内にそれらをカプセルに入れてください。jobを宣言する場合、ID属性はオプションです。

Syntax:

  <Job [id=JobID]>

For example:

<package>
  <Job id="PrintOutput">
  </Job>
  <Job id="ReadInput">
  </Job>
</package>

さらに、エラーチェックに対するtrue(1)かfalse(0)のブール値をとることができ、補足タグの使用によりデバッグすることをセットしておくこともできます。

  <? job error="true" debug="true" ?>

・The Script Element


script elementは、スクリプト・コード用デリミッターとしてクロージング・タグを定義します。

Syntax:

  <script language="languageName"> code </script>

For example.:

<?XML version="1.0"?>
<job>
...
<script language="PerlScriptt">
<![CDATA[
  sub ReturnValue {
  #
  # Perl code here
  #
  }
]]>
</script>
</job> 

・The Resource Element


resource elementは、ストリング用のプレースホルダーです。一度定義しておくと、スクリプト・コマンドと離れても同じスクリプト内であれば、使用することができます。

Syntax:

  <resource id="resourceID"> text or number to represent resource goes here </resource>

resourceIDパラメーターの中で指定されたリソースの内容を検索するために、getResource(resourceID)を使用します。

・The Reference Element


reference elementの使用により、外部タイプライブラリの定数を宣言なしにアクセスすることができるようになります。

Syntax:

  <reference [object="progID" | guid="typelibGUID"] [version="versionNo"] />