2019年2月16日土曜日

PowerShellで配列を手入力で使いたい

PowerShellを電卓として使う話の発展ですが、計算したい値が沢山あるとして、一つ一つを計算していると間違いやすくなってしまう、あるいは時間がかかってしまう・・・というような時の話です。

いやいやそんな時は、必殺のExcelを電卓にしろよ・・・と言われるでしょうが、Excel無い時とかどうしようもない。

PowerShellなら誰もが確実に持っている環境なので安心です。


たとえば、レンズの焦点距離を配列に格納し、それぞれ、フルサイズカメラに装着した時に、ASP-Cカメラの視点では焦点距離がどう変化するのか?というのを連続で計算したいと思います。



$A=@(15,20,24,28,35,40,50,85,100,150,200)

↑まずここが味噌ですが、配列にレンズの焦点距離を好きなだけ格納します。

PowerShellで手入力にて配列を使う時は、@()を使います。


function APSC($value){return [Math]::Round($value/1.6,0,[MidpointRounding]::AwayFromZero)}

↑ 計算式のメインですが、関数にして記憶しておきます。

元の焦点距離を÷1.6しているのですが、小数点以下が沢山出てくるので、四捨五入して整数に丸めます。

この時は[Math]クラスのスタティックメソッドRoundを使います。

PowerShellで四捨五入する時は[MidpointRounding]::AwayFromZeroオプションをを絶対に設定しないといけません。しないと0.5が1じゃなくて0になってしまいます



$A | %{APSC($_)}


↑いよいよ配列の内容をさっき作ったAPSC()関数を使って連続計算します。

単純な配列の繰り返し計算だけならもうこれだけでOK!!



$A | %{$_.ToString().PadLeft(3)+"mm => "+ (APSC($_)).ToString().PadLeft(3)+"mm相当"}


↑少し画面表示用にテキストを追加してみます。

この処理のポイントはたった一つだけ、%{}が配列の内容を繰り返し処理する構文という事です。



 15mm =>   9mm相当
 20mm =>  13mm相当
 24mm =>  15mm相当
 28mm =>  18mm相当
 35mm =>  22mm相当
 40mm =>  25mm相当
 50mm =>  31mm相当
 85mm =>  53mm相当
100mm =>  63mm相当
150mm =>  94mm相当
200mm => 125mm相当

↑画面表示が整形されて表示されました。

ちなみに、PadLeft(3)は、文字の左に空白を自動的に詰めて、指定桁数(今回は3桁)に揃えるメソッドです。