2014年1月29日水曜日

Windows PowerShellで文字列の数式を実行するEVALコマンドを使う!!

東芝dynabook tab VT484で、コマンドモードWindows PowerShellをかなりありがたく使わせて頂いておりますが、なんと、文字列の数式を実行するJavaScriptで言うところのevalが使えるんですね。

もちろんそのままEVALという名前ではなく、INVOKE-EXPRESSIONコマンドレットというやつです。

PowerShellを数式入力型の電卓とかで使っていると、これは果てしなく強力なコマンドレットであります!!


参考までに
PowerShellを使えるように設定する記事はこちらです
■まずはEVALでコマンド実行出来るようにします

コマンドレットはそのままINVOKE-EXPRESSIONでも良いのですが、せっかくなのでPowerShell起動時にEVALで実行出来るようにエイリアス登録します。

SET-ALIAS EVAL INVOKE-EXPRESSION;
を起動プロファイルの中に記述するだけでokです。

起動プロファイルはいちいち探さなくとも、以下のコマンドで編集可能になるので便利です。

NOTEPAD $PROFILE




■EVALコマンドは特大のお役立ちコマンドレット!!

EVALを使うと、たとえば文字列の"(128+128)/1.5"をそのまま数式として結果を求める事ができるようになりますが、この式を変数の中に格納しておいて後から使うことも可能になるというのもかなりデカいです。


■対角線を求める計算をしてみる

ちらっと、長方形の対角線の長さを計算してみます。

まず、平方根とべき乗を少ない入力で求めたいので、SQRT関数とPOWER関数を以下のように簡単に作っておきます。

#べき乗関数
FUNCTION GLOBAL:POWER($P_VALUE1,$P_VALUE2)
{
   RETURN [Math]::POW($P_VALUE1,$P_VALUE2);
}

#平方根
FUNCTION GLOBAL:SQRT($P_VALUE)
{
   RETURN [Math]::SQRT($P_VALUE);
}



たとえば、1920X1080のサイズの長方形の対角線を求める時に、以下のように式を文字列として変数に格納してから使う事が出来ます。

$E1 = "SQRT ((POWER 1920 2)+(POWER 1080 2))"
EVAL $E1

2202.9071700823




このように、場合によっては、結果の数字だけでなく、過程の式そのものを使いまわせるというのはかなり大きなメリットとなるかと思います。


たとえば、対角線を求める式を元にして、さらに16進数に変換する式を作る・・・というやり方も簡単に出来てしまいます。

$E1 = "SQRT ((POWER 1920 2)+(POWER 1080 2))"
$E2 = "[Convert]::ToString((" + $E1 + "),16)"

・変数の中に以下の式が文字列として格納されます。
$E2
[Convert]::ToString((SQRT ((POWER 1920 2)+(POWER 1080 2))),16)

・文字列の式を実行すると結果が得られます。
EVAL $E2
89b


なんかコマンドでコンピュータと対話するのって、今の時代だからこそ新鮮でより楽しい気がします。

気のせいですかね・・・。