WScript のバックアップソース(No.3)

#contents

* WScript/WSInvokeとは? [#p29ab8ad]

WScriptとWSInvokeは、AviSynthにおいて、Windows Scriptを利用可能にします。これにより、AviSynthスクリプトでは実現が難しい((たとえば、配列や繰り返し文(for、whileなど)のような。[[AVSLib]]や再帰関数を利用することによっても、配列や繰り返し文と同等のことが実現可能。))、より高度なスクリプティングが可能になります。

これらのフィルタは、[[warpsharpプラグイン(warpsharp.dll)>warpsharpパッケージ]]に内蔵されています。

** Windows Scriptとは? [#d833ae92]

Microsoftの[[MSDN ホーム ページ:http://www.microsoft.com/japan/msdn/]]には、以下のような説明があります:

>[[Windows Script:http://www.microsoft.com/japan/msdn/scripting/default.asp]]
>Windows Script は、Microsoft Windows プラットフォームのための包括的なスクリプティング・インフラストラクチャーです。

Windows 98以降のWindows OSには、このWindows Scriptを実行するためのホスト環境であるWindows Script Host(WSH)((参考: [[WSHとは 【Windowsスクリプティングホスト】 (Windows Script Host) ─ 意味・解説 : IT用語辞典 e-Words:http://e-words.jp/w/WSH.html]]))が、標準で搭載されています((参考: [[ASCII24 - アスキー デジタル用語辞典 - Windows 98:http://yougo.ascii24.com/gh/30/003064.html]]))。

WSHでは、それまでは「HTMLファイルに記述しておき、これをIEで表示する際に実行するためのものだった」ActiveXスクリプティングが、「WWWブラウジングと分離し、単独で実行できるように」なっています(鉤括弧内の文章は、[[ASCII24 - アスキー デジタル用語辞典 - Windows 98:http://yougo.ascii24.com/gh/30/003064.html]]より引用)。

** WSHがサポートするスクリプト [#wd06d5b6]

WSHでは、標準で、以下の種類のスクリプトをサポートしています:

>[[@IT:運用 Windows管理者のためのWindows Script Host入門 第2回 WSHスクリプト・コーディングの第1歩 1.スクリプト実行のプロセス:http://www.atmarkit.co.jp/fwin2k/operation/wsh02/wsh02_01.html]]
> WSHが標準でサポートするスクリプト・ファイル用の拡張子は以下のとおりである。
|~拡張子|~意味|h
|VBS|VBScript((引用者註: 参考: [[VBScriptとは 【Visual Basic Script】 ─ 意味・解説 : IT用語辞典 e-Words:http://e-words.jp/w/VBScript.html]]))言語で記述されたスクリプト・ファイル|
|JS|JScript((引用者註: 参考: [[JScriptとは ─ 意味・解説 : IT用語辞典 e-Words:http://e-words.jp/w/JScript.html]]))言語で記述されたスクリプト・ファイル|
|WSF|ジョブ単位でスクリプトを管理するXMLファイル|
|VBE|エンコードされたVBScript|
|JSE|エンコードされたJScript|

さらにPerlやRubyなどのスクリプト言語も、個別にインストールすることによって利用可能になります。

* WScript [#s97bebbb]

WScriptは、スクリプトファイルの読み込みとスクリプトのタイプの指定を行います。

** 書式 [#m659b639]

 WScript(file, type)

*** 引数 [#gb3570cb]

-file: スクリプトファイルのパス。
-type: スクリプトのタイプ。VBScript、JScript、JavaScriptなど。

* WSInvoke [#a9670908]

WSInvokeは、WScriptで読み込まれたスクリプトファイルの中で定義されている関数を実行します。

** 書式 [#z7de840c]

 WSInvoke(script, name, args)

*** 引数 [#db4e2a76]

-script: スクリプト。
-name: script内で指定された関数やサブルーチン。
-args: 引数。

* 使用例 [#h74f00e2]

簡単なWScriptの使用例を、いくつか紹介します。warpsharpパッケージに同梱されているサンプル((warpsharp_20**_**** > samples > wscript にあります。))も参考にしてください。

** 複数行のテキストファイルを1行ずつ読み込んでSubtitleフィルタで表示(JScript) [#g6727e0a]

複数行のアスキーアート(AA)が書かれたテキストファイル(aa_example.txt)を読み込んで表示させます。

-AAGenerator.js(JScriptファイル)
#code(JavaScript){{
var fs = new ActiveXObject("Scripting.FileSystemObject");

function AAGenerator(clip,filename,aa_x,aa_y,aa_start,aa_end,aa_font,aa_size,aa_text_color,aa_halo_color,aa_space) {
	var fp = fs.OpenTextFile(filename);
	var y = aa_y;

	AVS.last = clip;

	while(!fp.AtEndOfStream) {
		var str = fp.ReadLine();
		AVS.last = AVS.Subtitle(last,str,aa_x,y,aa_start,aa_end,aa_font,aa_size,aa_text_color,aa_halo_color);
		y = y + aa_space;
	}

	fp.close();

	return AVS.last
}
}}

--テキストファイルを開き、ファイルの最後まで「1行ずつ読み込む」 -> 「Subtitleフィルタで表示」を繰り返す(while文)。

-aa_example.txt(AAが書かれたテキストファイル)
                ∧∧
    ┃   ┏━┃     (,,゚∀゚)     ┃┃
  ━┏┛ ┏━┃ ━━/ つ━━┛ .┃┃
  ━┏┛ ┛  ┃   〜( ,ノつ      ┛┛
    ┛       ┛     (/        .┛┛

--[[じゆうなてきすと:http://text.vis.ne.jp/index.htm]]の[[キターAA集:http://blog.livedoor.jp/kitaaaaaaa3/]]に掲載されていたAAを使用。

-example1.avs(AVSファイル)
#code{{
LoadPlugin("D:\foo\warpsharp.dll") # オートローディング時不要
BlankClip(width=320, height=240, color=$eaeaea)
js = WScript("AAGenerator.js", "JScript")
js.WSInvoke("AAGenerator", last, "aa_example.txt",15,75,0,0,"MS Pゴシック",16,$000000,$eaeaea,16)
}}

-example1.avsをプレビューしたところ
#ref(wscript_js_example.png)

** for文を使って入力された数値を合計(PerlScript) [#c4051c15]

入力された数値を、その数だけ順に足していき、合計を求める。ActivePerl 5.8で動作確認。

-calc.pls(PerlScriptファイル)
#code(Perl){{
sub calc_sum{
	$num = @_;
	$total = 0;

	for ($i=0; $i<$num; $i++) {
		$total = $total + @_[$i];
	}

	return $total;
}
}}

--変数の数だけ繰り返し(for文)、$totalに加算。

-example2.avs(AVSファイル)
#code{{
LoadPlugin("D:\foo\warpsharp.dll") # オートローディング時不要
BlankClip(width=320, height=240)
pls = WScript("calc.pls", "PerlScript")
result = pls.WSInvoke("calc_sum",30,60,40) # 30+60+40
Subtitle(String(result)) # resultを表示
}}

-example2.avsをプレビューしたところ
#ref(wscript_pls_example.png)

* 参考 [#ue68575e]

-[[Kiraru2002's Room:http://members.at.infoseek.co.jp/kiraru2002/]]の[[tutorial - part 2 「引数いろいろ(5) FilterRangeEx part(4) --- おまけ ユーザ関数バージョン     2004. 7.27 (01版)」:http://members.at.infoseek.co.jp/kiraru2002/tutorial/tutorial2.html#arguments_5]]に掲載されているFilterRangeEx関数(複数の「指定フレーム区間に指定フィルタを適用する」関数)でも、WScript/WInvokeが使用されています(JavaScript使用)。