WScript

WScript/WSInvokeとは?

WScriptとWSInvokeは、AviSynthにおいて、Windows Scriptを利用可能にします。これにより、AviSynthスクリプトでは実現が難しい*1、より高度なスクリプティングが可能になります。

これらのフィルタは、warpsharpプラグイン(warpsharp.dll)に内蔵されています。

Windows Scriptとは?

MicrosoftのMSDN ホーム ページには、以下のような説明があります:

Windows Script

Windows Script は、Microsoft Windows プラットフォームのための包括的なスクリプティング・インフラストラクチャーです。

Windows 98以降のWindows OSには、このWindows Scriptを実行するためのホスト環境であるWindows Script Host(WSH)*2が、標準で搭載されています*3

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

WSHがサポートするスクリプト

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

@IT:運用 Windows管理者のためのWindows Script Host入門 第2回 WSHスクリプト・コーディングの第1歩 1.スクリプト実行のプロセス

 WSHが標準でサポートするスクリプト・ファイル用の拡張子は以下のとおりである。

拡張子意味
VBSVBScript*4言語で記述されたスクリプト・ファイル
JSJScript*5言語で記述されたスクリプト・ファイル
WSFジョブ単位でスクリプトを管理するXMLファイル
VBEエンコードされたVBScript
JSEエンコードされたJScript

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

WScript

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

書式

WScript(file, type)

引数

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

WSInvoke

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

書式

WSInvoke(script, name, args)

引数

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

使用例

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

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

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

  • AAGenerator.js(JScriptファイル)
    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が書かれたテキストファイル)
                   ∧∧
       ┃   ┏━┃     (,,゚∀゚)     ┃┃
     ━┏┛ ┏━┃ ━━/ つ━━┛ .┃┃
     ━┏┛ ┛  ┃   〜( ,ノつ      ┛┛
       ┛       ┛     (/        .┛┛
  • example1.avs(AVSファイル)
    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をプレビューしたところ
    wscript_js_example.png

for文を使って入力された数値を合計(PerlScript)

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

  • calc.pls(PerlScriptファイル)
    sub calc_sum{
    	$num = @_;
    	$total = 0;
    
    	for ($i=0; $i<$num; $i++) {
    		$total = $total + @_[$i];
    	}
    
    	return $total;
    }
    
  • 変数の数だけ繰り返し(for文)、$totalに加算。
  • example2.avs(AVSファイル)
    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をプレビューしたところ
    wscript_pls_example.png

参考

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

*1 たとえば、配列や繰り返し文(for、whileなど)のような。AVSLibや再帰関数を利用することによっても、配列や繰り返し文と同等のことが実現可能。
*2 参考: WSHとは 【Windowsスクリプティングホスト】 (Windows Script Host) ─ 意味・解説 : IT用語辞典 e-Words
*3 参考: ASCII24 - アスキー デジタル用語辞典 - Windows 98
*4 引用者註: 参考: VBScriptとは 【Visual Basic Script】 ─ 意味・解説 : IT用語辞典 e-Words
*5 引用者註: 参考: JScriptとは ─ 意味・解説 : IT用語辞典 e-Words
*6 warpsharp_20**_**** > samples > wscript にあります。

最終更新日時: 2014-03-11 (火) 03:49:45 (3690d)