ほげほげー

C#メインにプログラミング周りから日常のあれこれとかを不定期に書いていきます。

PowerShell の自動変数とその落とし穴

本記事は PowerShell Advent Calendar 22日目の記事です。

atnd.org

はじめに

先日書捨てのコード書いててこいつにやられた*1ので忘れないように。

なお、本記事は時間が無さ過ぎて相当圧縮された模様なのであしからず。

自動変数とは

PowerShell が自動的に生成、代入する変数のことです。

$_$Error などがよく使われていると思います。

一覧は以下のリンクから確認して下さい。

about_Automatic_Variables | Microsoft Docs

今回のおはなし

自動変数には割と一般名が使われているため、注意しないと出くわしてしまう問題があります。

というか、割と出くわして、毎回忘れてしまう類のもの。

知っている人に取っては今更感溢れる内容にはなるのでそっ閉じ推奨。

関数の引数に型付きで $Input って名前を付けるとい動かない事がある

事がある、と言ったものの、大抵の場合動かない。

理由は単純で、$INPUT が関数に渡された全ての入力を列挙する自動変数だから。

実際に以下の関数を定義して呼び出すとエラーが発生します。

function TestSample([int]$Input)
{
    Write-Host $Input
}

呼び出した時のエラーはこんな感じ。

TestSample -Input 123

TestSample : "System.Collections.ArrayList+ArrayListEnumeratorSimple" の値を "System.Collections.ArrayList+ArrayListEnumeratorSimple" 型から "System.Int32" 型に変換できません。
発生場所 行:1 文字:1
+ TestSample -Input 123
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [TestSample]、PSInvalidCastException
    + FullyQualifiedErrorId : ConvertToFinalInvalidCastException,TestSample

このエラーから自動変数であることを知らずに原因にたどり着くのはわりと時間かかるので困り者です。

が、知ってさえいれば未然に防ぐことも可能ですし、万一で遭遇しても比較的早く原因にたどり着くことができるはず。

というわけで、備忘録がてらアドベントカレンダーに参加したものの自動変数の説明入れつつ最後に落とし穴的にまとめようと思ったら時間がなくて落とし穴だけになってしまったという超縮小版記事でしたごめんなさいごめんなさい。

次は @oota_ken さんの「知っているかもなtype裏技」です。

*1:注意参照