PowerShellから対話形式でUWSCを動かすモジュールできた

随分前にUWSCを対話形式で操作できるのを作ったんだけど

UWSCのコマンドラインインタプリタ | たっぷす庵

これはUWSCが自前でCUI作ってたんですね
でもさーやっぱさー普段使ってるシェルからやりたいじゃーんて思うよね?
うん

そして今は空前のPowerShel時代です
じゃあPowerShelでやろう

やった
できた

https://github.com/stuncloud/PoshUWSC

やったー!

仕組み

UWSCに超簡易HTTPサーバー機能を持たせて、HTTPでやりとりします
つまりPowerShellからだと Invoke-WebRequest を使えばいいのです
楽ちん

導入

psm1ファイルです
モジュールです
しかるべき場所に配置してください
uwsファイルも一緒にね

使い方

PS> Get-Command -Module PoshUWSC

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-UwscState                                      0.0        PoshUWSC
Function        Get-UwscWindowId                                   0.0        PoshUWSC
Function        Get-UwscWindowStatus                               0.0        PoshUWSC
Function        Invoke-UwscFunction                                0.0        PoshUWSC
Function        Set-UwscPath                                       0.0        PoshUWSC
Function        Start-Uwsc                                         0.0        PoshUWSC
Function        Stop-Uwsc                                          0.0        PoshUWSC
Function        Test-Uwsc                                          0.0        PoshUWSC

こんな感じで関数が幾つかあります
一個ずつ説明していきますよ

Set-UwscPath

まずはモジュールに UWSC.exe の場所を教えてやらんといけません
そのための関数がこれです

PS> Set-UwscPath 'C:\Program Files (x86)\UWSC\UWSC.exe'

これやるとグローバル変数 $UwscPath にパスが格納されます
なので $PROFILE とかでやっとくと使うとき楽です

Start-Uwsc

実際にPowerShellからUWSCを動かすための準備が必要です
と言ってもこの関数を実行するだけです
これでUWSC側が127.0.0.1の57913ポートでListenし始めます

PS> Get-NetTCPConnection -LocalAddress 127.0.0.1 -LocalPort 57913 | ft -AutoSize

LocalAddress LocalPort RemoteAddress RemotePort State  AppliedSetting OwningProcess
------------ --------- ------------- ---------- -----  -------------- -------------
127.0.0.1    57913     0.0.0.0       0          Listen                12116

PS> ps -Id 12116

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    198      16     3680      12804    95     0.11  12116 UWSC

待受ポートは任意に指定できます

Start-Uwsc 55555

Get-UwscState

UWSCが待ち受け状態かどうか確認するための関数です
動いてない、動いてる、動いてたけどもう止まってる
ことがわかります

Stop-Uwsc

UWSCに待ち受けを止めさせるための関数です
ほっとくとずっと動きっぱなしなので必要なくなったら止めてあげましょう

Invoke-UwscFunction

はい出た
UWSCの関数を実行します

PS> Invoke-UwscFunction -Function msgbox -Arguments '"やったー!"','btn_yes or btn_no'

こんな感じですね
これがUWSC上でevalされて

msgbox("やったー!", btn_yes or btn_no)

が実行されるというすんぽーよ
リテラル文字列を渡したい場合はダブルクォートで括ってやらんといかんのでちょっと面倒です
面倒はよろしくないです、ないですが、これといった案が浮かばずこのままです

こいつの戻り値は psobject です

Variable   Value Error
--------   ----- -----
PoshVar[1] 4

UWSC側で実行された関数の戻り値は全て連想配列 PoshVar に突っ込まれます
キーは数値で0からインクリメントされていきます
Variable にはキー入りの変数名が返ってきてるので、これをそのまま Invoke-UwscFunction に渡せばevalで評価されて値が取り出せるというわけです
Value には値そのものが入っています、値だけ欲しい場合はここから取れます
Error には TRY_ERRMSG が入ります

Get-UwscWindowId

Get-UwscWindowStatus

Invoke-UwscFunction だけだとだんだんめんどくさい気持ちになってしまうので、こういった関数も用意すべきです
とりあえずはウィンドウIDの取得とステータスの列挙をするやつ

PS> $id = Get-UwscWindowId '"powershell"'
PS> Get-UwscWindowStatus $id


ST_TITLE     : Windows PowerShell (Admin)
ST_CLASS     : VirtualConsoleClass
ST_X         : 831
ST_Y         : 214
ST_WIDTH     : 1036
ST_HEIGHT    : 780
ST_CLX       : 839
ST_CLY       : 245
ST_CLWIDTH   : 1020
ST_CLHEIGHT  : 741
ST_PARENT    : -1
ST_ICON      : False
ST_MAXIMIZED : False
ST_VISIBLE   : True
ST_ACTIVE    : True
ST_BUSY      : False
ST_ISID      : True
ST_WIN64     : True
ST_PATH      : D:\Software\ConEmu\ConEmu64.exe
ST_PROCESS   : 8624
ST_MONITOR   : 0

いい感じですね、PowerShell使ってる感も出るし
こんな風に便利関数たくさん追加したらきっとより便利になる気がするのでいつかやろうね

今後の予定

これ書いてたら式を処理する為の関数が足りてないことに気付きましたよ
関数だけじゃだめだろ!
はい
そのうちなんとかします
あとReadMeも書かないとね…

広告

PowerShellから対話形式でUWSCを動かすモジュールできた」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中