satocchiaブログ

satocchiaブログ

PR

キーワードサーチ

▼キーワード検索

プロフィール

satocchia

satocchia

カレンダー

お気に入りブログ

まだ登録されていません

コメント新着

effelpist@ kilovermek.es effelpist <a href="https://kilovermek.es/…
tomoZo@ Re:Pale Moon日本語化トラブル(06/06) はじめまして。 28.16.0でまたもや提供さ…
satocchia @ Re[1]:Pale Moon日本語化トラブル(06/06) zui_9さんへ 本日、確認しました。ようや…
zui_9 @ Re:Pale Moon日本語化トラブル(06/06) 上記リンク「Githubのプロジェクト」の左…
わたなべ@ Re:powershellコンソール、見づらくありませんか?(08/26) 初めまして、この情報最高です! 背景を白…

フリーページ

2019.10.05
XML
カテゴリ: UWSC
uwscのpowershell関数にあれこれ悩んでいます。

まず、起動が遅い。起動するためのオーバーヘッドは半端ないんだろうな。
しかも、起動したpowershellのインスタンスを再利用できません。
前回の結果を次のセッションで利用することができず、いつも単発の呼び出しだけ。

じゃ、uwscからpowershellを呼ぶんじゃなくて、powershellからuwscを呼べばいいんじゃない? 
あるんですよ。

stuncloud さんの​ PoshUwsc

しゅんさんの​ powershell_uwsc_bridge
とか。

でも、uwscメーンで、powershellのインタンスを1回起動したら、そのあとそのインスタンスとやり取りしたいってのもあってもいいんじゃない。つまり、powershellを起動しっぱなしにする。powershell側に目に見えないGUIを持たせてUWSCから操縦するってのを作ってみました。

uwscユーザーですので、ソケットとかHTTPサーバとかじゃなく、ひたすらgetid sendstr clkitem getstrでいきます。

※debugをtrueにすればGUIが見えます。
※以前やった UWSCのpowershell関数をスピードアップ の改訂版です。

呼び出し例

StayOnPs.debug=false
sop=StayOnPs.new()
msgbox(StayOnPs.execute("ls"))
msgbox(StayOnPs.execute("ls .."))




module StayOnPs
dim instancemax=10
hashtbl instance
public DEBUG=true
function new()
if length(instance)>instancemax
msgbox("powershellの実行数が上限を超えました")
exit
endif
uwsPid=status(getid(get_thisuwsc_win),st_process)
result=uwsPid + "_" + gettime()
result=result + "_" + g_time_zz2
src=replace(psdlg_src,"<TITLE>",result)
src=replace(src,"<UWSPID>", uwsPid)
if DEBUG
src=replace(src,"<DEBUG>", "$true")
else
src=replace(src,"<DEBUG>", "$false")
endif
powershell(src,true,false)
id=getid(result,,5)
if status(id, st_isid)
ctrlwin(id,show)
instance[result]=1
else
msgbox("powershellの実行に失敗")
exit
endif
textblock psdlg_src
add-type -assembly system.windows.forms
$title="<TITLE>"
$uwsPid="<UWSPID>"
$doNotShow=!<DEBUG>
$prompt="sop>"
$timer=new-object windows.forms.timer -property @{interval=55}
$form=new-object windows.forms.form -property @{text=$title}
$timer.add_tick({
if(ps -id $uwsPid){
}else{
ps -id $pid|kill
}
})
$form.add_shown({$timer.start()})
$base=new-object windows.forms.flowlayoutpanel -property @{dock="fill";parent=$form}
$inBox=new-object windows.forms.textbox -property @{
parent=$base;
multiline=$true;
text=$prompt
}
$outLabel=new-object windows.forms.label -property @{
parent=$base;
text=$prompt
}
$clr=new-object windows.forms.button -property @{
parent=$base;
text="reset"
}
$exe=new-object windows.forms.button -property @{
parent=$base;
text="exec"
}
$quit=new-object windows.forms.button -property @{
parent=$base;
text="quit";
dialogresult="ok"
}
$clr.add_click({
$outLabel.text=$prompt
$inBox.text=$prompt
})
$exe.add_click({
try{
$res=iex $inBox.text
}catch{
$res=$error[0]
}
$outLabel.text=$res
$inBox.text=$prompt
})
if ($doNotShow){
$form.opacity=0.01
$form.formborderstyle="none"
}
$form.showdialog()
endtextblock
fend

function quit(title="newest")
if title="newest"
title=instance[length(instance)-1,hash_key]
endif
result=clkitem( getid(title), "quit" )
if result 
endif
fend
procedure quitAll()
for i =0 to length(instance)-1
this.quit( instance[i, hash_key ])
next
fend
function execute(str,title="newest")
if title="newest"
title=instance[length(instance)-1,hash_key]
endif
id=getid(title)
clkitem(id,"reset")
sendstr(id,str,1,true)
clkitem(id,"exec")
repeat
result=getstr(id,0,str_acc_static)
until result<>"sop>"
fend
endmodule





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2019.10.05 21:15:51
コメントを書く
[UWSC] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: