関連付けと異なるアプリでファイルを実行する

まずはたとえば拡張子.txtに関連付けられたアプリケーションを探す。
wsh = new ActiveXObject("WScript.Shell");
rootTxtExePath = wsh.RegRead(
'HKCR\'+ wsh.RegRead('HKCR\.txt\') +'\shell\open\command\'
);
HKCRから取得されるのはメモ帳。
%SystemRoot%\system32\NOTEPAD.EXE %1 

HKCUではVistaや7とXPとではパスが途中から異なっている。
var commonPth ='HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer'+
'\\FileExts\\.txt\\';

if(/Windows NT 6/.test(navigator.userAgent)){
try{
var txtExeId = wsh.RegRead(commonPth +'UserChoice\\Progid');
var txtExeCmd = wsh.RegRead('HKCU\\Software\\Classes\\'+
txtExeId +'\\shell\\open\\command\\');
}catch(e){}
}else{
try{
var txtExeId = wsh.RegRead(commonPth +'Application');
var txtExeCmd = wsh.RegRead('HKCU\\Software\\Classes\\Applications\\'+
txtExeId +'\\shell\\open\\command\\');
}catch(e){}
}
取得した実行コマンド
"C:\sakura\sakura.exe" "%1" 

引数の"%1"を実際の開きたいファイルパスに置換し、そのままRun()。
wsh.Run(txtExeCmd.replace(/%1/,'開きたいファイルのパス'));






TTLマクロメーカー

マクロ生成ボタンを押すと、入力シェルのテキストをTeraTermのTTLマクロにします。
右側のシェルコマンドリストにあるものがTTLマクロに変換され、 それ以外はダンプします。



 入力シェルのテキスト (行頭空白行はコメントアウト)
 コマンドリスト(タブ区切り)

Host: Shell wait prompts:





偶数か奇数かで引用符を切り替える

※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。
アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね!
というわけでTTLメーカーサンプルを見てください。



複数の引用符が連なる行をTTLマクロで自動送信するの続き。

1重引用符と2重引用符の両方を含むこのようなコマンド行。
echo "$MJ" |grep 'we' |egrep "[MJ]"

まず、先に来ない方の引用符(この例では「'」)で区切った配列にするとこうなる。 *1
0| echo "$MJ" |grep 
1| we
2| |egrep "[MJ]"
 *1: ふつうsplit関数やメソッドは区切り文字は削除して返すので、we の左右の引用符はなくなる。

それらを、配列の区切り文字に使ったその引用符で囲むとこうなる。
0| 'echo "$MJ" |grep '
1| 'we'
2| ' |egrep "[MJ]"'
この時点で、重複しない引用符で囲っての文字列リテラルとなっている。
ただし、もとの文字列の 'we' の「'」はつけ直す必要がある。あとは、配列インデックスが奇数のときに、そのさらに外側を「'」には「"」で、「"」には「'」で囲んでやればいい! *2

先頭にteratermマクロ関数の「send」と、最後にLFの#10も加えてTTLマクロになった結果は、
send 'echo "$MJ" |grep '
send "'we'"
send ' |egrep "[MJ]"'
send #10

デモはTTLマクロメーカー
ソースのサンプル。先にあるのが「'」なら「"」を、「"」なら「'」を返すような関数を用意しておいて、
function qType(s){
var sq = s.indexOf("'");
var dq = s.indexOf('"');
if((sq == -1)&&(dq == -1)) return "'";
if(sq == -1) return "'";
if(dq == -1) return '"';
if(sq < dq) return '"';
}
配列で回す。
var q = qType(s);
var array_s = s.split(q);
var qq = (q =="'") ? '"' : "'";
for(var k=0; k < array_s ; k++){
if(!array_s[k]) continue;
if(k % 2 == 0) rep +='send '+q+ array_s[k] +q+"\r\n";
else rep +='send '+qq+q+ array_s[k] +q+qq+"\r\n";
}
rep += 'send #10;


*2: シェルでそういう使い方が必要な時があるとするならば、行の最初に見つかった引用符が後ろでネストして使われているとだめ。たとえば、「echo "$MJ" |grep 'a"$b"c'」




複数の引用符が連なる行をTTLマクロで自動送信する

※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。
アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね!
というわけでTTLメーカーサンプルを見てください。



シェルコマンド行をTeratermマクロで自動実行するには、sendln関数に文字列を渡して記述する。
echo "Michael Jackson knows we sad. but we can not heal him"

であれば、マクロファイルには次のように書く。
sendln 'echo "Michael Jackson knows we sad. but we can not heal him"'

ここで気をつけるのは引用符だ。
sendln "echo "Michael Jackson knows we sad. but we can not heal him""
と書くと、マクロは"echo "の後ろの二重引用符を文字列リテラルの終了と解釈するので、それに続くMichael~はマクロソースとして解釈できませんという構文エラーになる。

リテラルとはソースコード中の定数のことで、多くの言語では文字列を引用符で囲んで範囲を指定する。TTLマクロも「'」と「"」を使用するので、上の問題が起こらないように使用する。

しかし、下のように1行内に両方の引用符が使われているケースでは、
MJ="Michael Jackson knows we sad. but we can not heal him"
echo "$MJ" |grep 'we' |egrep "[MJ]"
sendln 'echo "$MJ" |grep 'we' |egrep "[MJ]"'
sendlnに渡す文字列の範囲を指定しようがなくなるので使えなくなってしまう。

こういうときは、文字列に改行文字を付加しないもう一つの関数、sendを使って下のように書けば大丈夫だ。
send 'echo "$MJ" |grep '
send "'we'"
send ' |egrep "[MJ]"'
send #10
最後の#10は改行のLFで、TeraTerm画面上では元のコマンドそのままに
echo "$MJ" |grep 'we' |egrep "[MJ]"
と実行される。
しかし、こんなことを手でシコシコやっていては日が暮れてしまう。自動化する方法はないか?ということで作ってみた。面白かったのは、文字列を引用符ごとに切った配列のインデックスが偶数か奇数かどうかでsendで使うべき引用符が「'」と「"」のどっちを使うのか処理できてしまうところだった。というわけで続きは次回






Window7 テクニカルセミナー


場所は秋葉原駅前UDXビル。参加者はベクターの登録開発者限定だ。これはなにかプレミアムなのだろうか?

ベクターとマイクロソフトの共催でWindowsアプリ開発に積極的な人が200人以上収容できる部屋の後ろまで埋まっていた。

しかし、Windowsもデビューして20年弱。写真のとおり平均年齢は30代以上、前の方の席は40代以上。Windowsとともに年を重ねてきた人達なのだろう。「トッププログラマーである皆さん」ってマイクでおっしゃるけども、目をギラギラさせた人はいなかったし、全体の加齢臭はどうしても否めない。
「この業界は20年かけて大きな会社に成長しても、MSのように激しい競争にさらされ続けています。私はそんなところも好きなんです」と、MSの方が話されていて印象に残った。

考えてみれば、Windowsアプリにiphoneアプリと同じだけの金額を払う人は多くないだろう。コード量はずっと多く、機能がリッチだったとしてもである。

解説されるWindows7の新しいUI、タッチパネル対応にしても、連想するのはiphoneのそれであり、ちぐはぐな感じがしたのは僕だけだろうか。JavaScript2とHTML5+CSSで何でもできるようになるんじゃないかというご時勢である。そこに触れられることがほとんどなかったのが、僕としては残念だ。

MicroSoftは強力な武器を持っている。世界中のオフィスの重要なファイルはMicroSoftのフォーマットによって管理されているのだ。たとえそれらがどんどんクラウド化されていこうと(MS自身、オフィスをWEBバージョンで無料公開するといっている)、アプリケーションをJavaScript2とHTML5で作成しようというときのアドバンテージは大きいのではないか?なぜWindowsでアプリというとき、コーディング負荷のあるC++やC#でなければならないのか?僕には分からない。なぜガジェットという足かせを外さないのか?powershellとかsilverlightもいいけども。クリーンインストールされた職場のPCで威力を発揮するのはやっぱり、今は見向きもされないHTAだ。






while(aho.atEndofStream)

笹部 政宏
笹部 政宏
mail




フリーソフツ
Category
はてブ
Monthly Archive
New Entry
New Comment
New Trackback
RSS
Copyright © Kittens flewby me All Rights Reserved.