Cacapon的PowerShellで慣れない挙動ベスト3

最近仕事でPowerShellスクリプトを書いたのですが、

PythonだったりBashだったりで慣れているCacaponにとっては

かなり厄介な挙動があったので、ランキング形式で紹介したいと思います。

第3位 エンコーディング問題

私は基本的にエンコーディングUTF-8で行なっていているのですが、

PowerShellエンコーディングはデフォルトがShift-JISになる様です。

これで困ったのが2点

一つ目は、コマンドから実行するとShift-JISで書かれたコードが日本語が文字化けすること

ついでというか"が文字化けに巻き込まれてしまって正常に動かない時もありました。

なので、仕事で作成する際はUTF-8で書くことにしてました


二つ目は、PowerShell ISEというIDEがあるのですが、

これがShift-JIS 前提らしくUTF-8だと文字化けして使えないこと。

Tab候補とかがかなり優秀に感じたので使いたかったのですが、

日本語混じりになると使えなかったので、途中から別のエディタで作成していました。

第2位 配列の要素が一つだと配列でなく中身が返ってくる問題

PowerShellの場合、配列は $x = @(1,2,3)のように宣言するのですが、

複数この場合は配列のタイプになるのですが、$x = @(1)とかだと中身だけになります。


この仕様で何が問題になってくるかというと、

素数が1の場合 $x[0] と中身にアクセスしようとするとエラーになります。

というのも$x は 1になっているからです。配列ではなくIntなので配列様にアクセスするとエラーになってしまうのです。


lsみたいにファイルの一覧を取ってくるスクリプトを作っていたのですが、 ユニットテストで挙動の確認をしていたらこのエラーにぶち当たりました。

原因特定できるまで結構悩んだのですが、工夫をすると要素数1の配列にできることがわかったので、そのやり方で要素数が1でも配列を返す様にしました。

第1位 返したい値以外もreturnで複数の値が返ってくる問題

PowerShellは他のスクリプト言語と似たようにfunctionで関数を定義できます。

returnで返り値を返すこともできるのですが、この仕様も他とは一線を異なるようです。


なんと、他の式も一緒にくっついてくる場合があるようです。

この辺の挙動ははっきりとわかっていませんが、私が実装したものでは

for文で回した時の$iの値が一緒にくっついていました。*1

この辺りは想定外の挙動になることが多く、[void]をつけたり >nullをつけたり色々試してやっとなんとか、特定の返り値だけ返すという状態に至りました。

まとめ

言語が違うと書き方が異なるのは当たり前かと思いますが、

bashなどのスクリプトと似たようなものかなぁと高を括っていたら痛い目を見ました。

みなさんも新しいプログラミング言語を学ぶ時は気をつけましょう。

本日はここまで、それではまたお会いしましょう。

*1:別のスクリプトで再現確認をしてみたのですが、うまくいきませんでした。