処理に時間の掛かるバッチ処理を別プロセスで実行する 2017-03-01 (Wed) 22:08

X-Finderでファイルを複数選択して、おのおのにコマンドを実行するようなスクリプト処理を行うと、こんなメッセージが出ることがある。

The script you are executing is taking longer than expected to run.
Click End to abort the script, or Continue to continue script execution.
[End] or [Continue]


スクリプトの実行時間が既定のタイムアウト値を超えたのが原因なのだろうが、時間が掛かるのを承知で処理している場合には、

これが何度も出てやっかいだったりする。タイムアウト値を任意に変更、或いは無効にしたりする方法がわからないので、

wscript.exe (以降 WSH)に処理を投げて別プロセスで実行させる。(WSHではパラメタで指定しない限り無制限で実行されるようだ。)

WSHに投げるスクリプト中では、X-Finder独自のオブジェクトは使えないため、一部の環境変数を引き継げるようにしておく。

で、その機能を一まとめにしてインクルードして使えるようにする。

◎サンプル

以前に書いた、画像ファイルの拡張子正規化 を書き直したもの。
/*
選択された画像ファイルのformatをチェックし拡張子を正規化する

ex) jpgファイルなのに拡張子がpngになってるファイルの拡張子を png → jpgにリネーム

画像ファイルのformatチェックに ImageMagick(portable版) を使用
http://www.imagemagick.org/script/binary-releases.php#windows
http://www.imagemagick.org/script/escape.php

拡張子の調整
ImageMagickの画像フォーマットのタグとファイル拡張子の関連付けはソース中の変数「T」で
任意に変更可能。現状よく使う jpg,gif.png,bmpしか定義してない
それ以外はImageMagickのタグを小文字変換したものを拡張子とする

ImageMagickの画像フォーマットについては
https://www.imagemagick.org/script/formats.php
*/
function main(){
var XF_SCRIPT_PATH = 'D:/Tools/X-Finder/Script/';
var fs = new ActiveXObject('Scripting.FileSystemObject');
try{
var f = fs.OpenTextFile(fs.BuildPath(XF_SCRIPT_PATH, 'funcs.js'));
var src = f.ReadAll();
f.Close();
eval(src);
}
catch(e){
if(f) f.Close();
WScript.Echo('Include Error!!');
WScript.Quit();
}


var T = [ { tag: /^JPEG.*/i, ext: 'jpg' },
{ tag: /^BMP.*/i, ext: 'bmp' },
{ tag: /^GIF.*/i, ext: 'gif' },
{ tag: /^PNG.*/i, ext: 'png' }
];
var cSel = X.CSel;
var current = X.Current;
var shellapp = new ActiveXObject('Shell.Application');
var folder = shellapp.NameSpace(current);

for(var i = 0; i < cSel.Count; i++){
var file = cSel.Item(i);
if(!fs.FileExists(file)) continue;
var exe = funcs.exec('identify.exe -format "%m" ' + file);
if(exe.exitcd) continue;
var t = T.find(function(e){ return e.tag.test(exe.stdout); });
var e = (t ? t.ext : exe.stdout).toLowerCase();
if(fs.GetExtensionName(file).toLowerCase() != e){
folder.ParseName(fs.GetFileName(file)).Name = fs.GetBaseName(file) + '.' + e;
}
}
fs.DeleteFile(WScript.ScriptFullName);
WScript.Echo('処理終了');
}
if(typeof FORK_DEF === 'undefined') WScript.Include('fork.js');
var cSel = WScript.Col(WScript.Env('CurrentSelected'));
if(cSel.Count == 0 || !funcs.fs.FolderExists(WScript.Env('Current'))) WScript.Quit();
fork(main, 'X');


・解説
main()が WSH に投げる処理。従ってこの中では X-Finderの独自オブジェクトは使えない。

青色部分は 別ソース(funcs.js)をインクルードしている。
WSHのスクリプトでは標準で別ソースをインクルードする機構がないので、テキストファイルとして読込んで evalしている。
因みに funcs.jsはよく使う関数をまとめたもので、X-Finderでも WSHでもインクルードできるようになっているが、
WSHで使う時には、XF_SCRIPT_PATHに X-Finderのスクリプトパス(インクルードファイルの場所)を指定する必要がある

緑色部分が X-Finderのスクリプトとして実行される部分。
ここでインクルードしている fork.jsがWSHに投げる処理を行うソース。
fork(main, 'X'); で main()をWSHに投げる。
'X'は WSHに投げるソース中でX-Finderの一部の環境変数を保存する変数名。(省略時は'XFObj')
関連記事

コメントの投稿

管理者にだけ表示を許可する

注意事項
基本的にこのブログはブログ主の備忘録です。

ブログの内容にはブログ主の主観や時には正確でない情報が含まれていることもあります。書いてある内容がすべての環境にあてはまることを保証するものでもありません。
また過去の記事の情報はそれが参照された時点では既に陳腐化していることもあります。

その辺をご理解の上で当ブログ内に書いてあることを試す場合は自己責任でお願いします。

万一何らかの損害が生じても責任は持てませんのであしからず!

記事内容の誤りの指摘、疑問点の回答などコメント頂けると助かります。
カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
ブログ内検索
カラーコードチェッカ
カラーコードの確認
入力例) #ffffff | blue
カテゴリ
最新記事
最新コメント
最新トラックバック
リンク
ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文: