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("マッチしました");