Tips

スクリプト作成時の参考になるよう、単純なスクリプトを幾つか紹介する。

マークファイルを対象にした操作(カーソル移動あり)

//!*script

//マークがなければ終了

if (PPx.EntryFirstMark == 0){

command = '%"' + (PPx.ScriptName).replace(/^.+\\(.+$)/,'$1') + '"'

+ '%:%I"内部エラー。カーソル移動に失敗しました。"';

PPx.Execute(command);

PPx.Quit(-1);

}

while(true){

// ここで個別の処理

PPx.Echo(PPx.EntryName);

if(PPx.EntryNextMark == 0) break;

}

マークしたファイルを対象にした操作を、カーソル移動付きで行う。

これは、マークファイルの名前をEchoするだけのスクリプト。

マークファイルを対象にした操作(カーソル移動なし)

//!*script

var EntryObj = PPx.Entry;

RetCD = EntryObj.FirstMark;

// マークがなければ終了

if (RetCD != 1) {

command = '%"' + (PPx.ScriptName).replace(/^.+\\(.+$)/,'$1') + '"'

+ '%:%I"内部エラー。カーソル移動に失敗しました。"';

PPx.Execute(command);

PPx.Quit(-1);

}

while(true){

// ここで個別の処理

PPx.Echo(EntryObj.Name);

if(EntryObj.NextMark != 1) break;

}

マークしたファイルを対象にした操作を、カーソル移動無しで行う。

このスクリプトも、マークファイルをEchoしているだけ。

Paper Plane xUI Part.5 726-727を参考にした。

カレントディレクトリのすべてのエントリを対象にした操作

//!*script

for (var i = 0; i < PPx.EntryAllCount; i++) {

// エントリがディレクトリの時のみ処理

if (PPx.Entry(i).Attributes & 16) {

PPx.Echo(PPx.Entry(i).Name);

}

}

カレントディレクトリのすべてのエントリを対象にした操作。

真ん中で条件分岐させて、必要なエントリだけを対象にする。

これは、ディレクトリの名前をEchoするだけのスクリプト。

特定のディレクトリのエントリを対象にした操作

//!*script

var fso = PPx.CreateObject("Scripting.FileSystemObject");

var fn = PPx.Extract("%0");

// Folderオブジェクトを取得

var folder = fso.GetFolder(fn);

// サブフォルダのリストを取得

var e = new Enumerator( folder.SubFolders );

var subdirlist = new Array();

for( ; !e.atEnd(); e.moveNext()) {

subdirlist.push(e.item().Name);

}

PPx.Echo(fn+"にあるディレクトリは"+subdirlist+"です。");

// オブジェクトを解放

fso = null;

カレントディレクトリ以外のエントリを対象にするときは、こんな感じになる。

起動中のPPXのIDを取得

//!*script

// 実行元のPPvIDを文字コードに変換

var useppv = PPx.Extract('%n').slice(1).charCodeAt(0) + 1;

// 実行元PPvよりアルファベット順で後のPPvがあればフォーカスを移す

for (var i = useppv; i < 91; i++) {

ppvid = String.fromCharCode(i);

if (PPx.Extract('%NV' + ppvid).match(/.+/)) {

PPx.Execute("*focus V" + ppvid);

PPx.Quit(-1);

}

}

// 実行元PPvよりアルファベット順で前のPPvがあればフォーカスを移す

for (var i = 65; i < useppv; i++) {

ppvid = String.fromCharCode(i);

if (PPx.Extract('%NV' + ppvid).match(/.+/)) {

PPx.Execute("*focus V" + ppvid);

PPx.Quit(-1);

}

}

窓間移動をもう少し複雑にするときに必要になる。

これは、PPv間で窓間移動するスクリプト。

メニューを作って実行する

//!*script

// メニューの削除

PPx.Execute("*setcust -|M_hoehoe =");

// メニューの登録

PPx.Execute('*setcust M_hoehoe:項目1=*linemessage homuuuu!');

// メニューを開く

PPx.Execute("%M_hoehoe");

真ん中のメニューの登録のところをいじって、好きな項目を追加する。

コメントファイルの作成

//!*script

var strLine = "\n";

var fso = PPx.CreateObject("Scripting.FileSystemObject");

for (var i = 0; i < PPx.EntryAllCount; i++) {

// ディレクトリ以外を対象にする

if (PPx.Entry(i).Attributes ^ 16) {

// "ファイル名"+Tab+コメントにしたい情報+改行

strLine += '"'+PPx.Entry(i).Name+'"\t'+ PPx.Entry(i).Size+'\n';

}

}

// カレントディレクトリに00_INDEX.txtを作成

var strCreateFile = fso.BuildPath(PPx.Extract('%1'),"00_INDEX.txt");

fso.CreateTextFile(strCreateFile);

// 00_INDEX.txtに書き込み

var objOutFile = fso.OpenTextFile(strCreateFile, 2);

objOutFile.Write(strLine);

objOutFile.Close();

「コメントにしたい情報」の箇所をいじる。このサンプルでは、エントリのサイズをコメントにしている(特に意味は無い)。

リストファイルの作成

//!*script

var strLine = ";ListFile";

var fso = PPx.CreateObject("Scripting.FileSystemObject");

var fn = fso.BuildPath(PPx.Extract("%1"),"listfile.txt");

for (var i = 0; i < PPx.EntryAllCount; i++) {

strLine += "\r\n"+ fso.BuildPath(PPx.Extract("%1"),PPx.Entry(i).Name);

}

// ファイルに書き込み

fso.CreateTextFile(fn);

var sw = new ActiveXObject("ADODB.Stream");

sw.Type = 2;

sw.charset = "utf-16";

sw.Open();

sw.WriteText(strLine,1);

sw.SaveToFile( fn, 2 );

sw.Close();

リストファイルを作成する。このサンプルは、フォルダ内のファイルをすべてリストファイルにしているだけで、あまり意味はない。

工夫すれば、作成時刻やサイズも取得できるみたいだが(参考:PPxHelp)、難しそうなので僕はやっていない。

一体化型か独立型かで分岐

//!*script

if (PPx.GetComboItemCount < 1){

PPx.Echo("一体化窓ではありません");

} else {

PPx.Echo("一体化窓に登録されているPPcの数は"+PPx.GetComboItemCount+"です");

}

PPx.GetComboItemCountで、一体化窓に登録されている窓の数を取得できる。これが0だと、一体化窓では無いということ。

一体化窓用のスクリプトを、一体化窓以外で使おうとすると都合が悪い場合があるので、これで回避する。

Multibyte版でもUnicode版でも起動できるようにする

//!*script

if ( PPx.CodeType == 0 ){ // MultiByte版かそうでないかで分岐

var ppcname = 'ppc';

var ppvname = 'ppv';

}else{

var ppcname = 'ppcw';

var ppvname = 'ppvw';

}

PPx.Execute("%Ob "+ppcname);

Multibyte版でもUnicode版でも使えるスクリプトにするときに、覚えておくと便利なのかもしれない。

正規表現パターン

ファイルパスを正規表現パターンにするとき、「バックスラッシュの数っていくつにすればいいんだ…?」となるので、サンプルを置いておく。

以下は、カレントパスがPPxフォルダ以下ならダイアログを表示するスクリプト。

//!*script

var fn = PPx.Extract("%0");

var re = new RegExp(fn.replace(/\\/g, "\\\\"), 'i');

var str = PPx.Extract("%1");

if (str.match(re)) PPx.Echo("マッチしました");