MACアドレスの取得とUWSCの優位性について

別件調査中に、UWSCでのMACアドレス取得方法を見つけた。
http://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=2855&log=ON&cnt=24
相変わらず素晴らしい。

msgbox(betweenstr(doscmd("ipconfig /all"), "Physical Address. . . . . . . . . : ", chrb(13)))

このシンプルさ。
ただ、

はたしてどれだけの言語がこの処理を1行で書けるだろうか?

ともあったので、必死に考えてみた。



とりあえず考える

手元のWindows環境にはPerlすらないので、WSH(VBS/JS)かPowershell
Powershellは、doscmdは問題なし。betweenstrは正規表現だね。

[Text.RegularExpressions.Regex]::Match((ipconfig /all), "(?:Physical Address[^:]*: )([^ ]*)").Groups[1].Value

少し長いですね。
名前修飾がなんとかなればねぇ。
まあ、UWSCのbetweenstrが偉大です。
正規表現は柔軟なのですきなんですけどね。


次にWSH/JScript

WScript.Echo((new ActiveXObject('WScript.Shell')).Exec('ipconfig /all').StdOut.ReadAll().match(/(?:Physical Address[^:]*: )(.*)/)[1])

また長くなりました。
Execするのにオブジェクトを作って、結果取り出しのメソッド連結が痛い。


最後に、WSH/VBScript

WScript.Echo Split(Split(CreateObject("WScript.Shell").Exec("ipconfig /all").StdOut.ReadAll,"Physical Address. . . . . . . . . : ")(1))(0)

VBSには、Split関数という味方がいますね。
これも実行用オブジェクトが痛い。

対比

言語 表示 コマンド実行 切り出し 備考
UWSC MSGBOX DOSCMD(〜) BETWEENSTR
Powershell (なし。オブジェクト返すと表示) (〜) 正規表現 切り出しが判り難いか
WSH/JS WScript.Echo (WScript.Shell).Exec(〜).StdOut.ReadAll 〜.match 実行結果取得がね
WSH/VBS WScript.Echo (WScript.Shell).Exec(〜).StdOut.ReadAll Split(Split) wscriptでもコマンドプロンプトが出るのも

考察

最初、複文が必要かと思ったのですが、なんとかなりました。
Powershellは最初からいけると思いましたが。
Javascriptは苦戦しました。
VBScriptはSplit関数を思い出して、なんとか複文を免れました。
やりたいことがシンプルに出来るよう用意されている、それがUWSCの強みですね。