文字列内変数展開の罠
Power Shellでは、「"」で括られた文字列内の変数は、自動的に展開されます。
PS F:\> $name = "foo" PS F:\> echo "My Name is $name" My Name is foo
機能的には、「Rubyみたいに"#{}"で囲む必要ないんだー、へー、」というだけなんですが、ここにちょっとした罠が隠されているのです!具体的にはまったのは以下。
PS F:\> $h = "foo.com" PS F:\> $p = "80" PS F:\> echo "http://$h:$p" http://80
実際には「$h」「$p」は引数で渡されていて、そこからURLを構築しているのですが、なぜか「$h」がスルーされる。引数の渡し方がまずいのかとしばらく悩んだ挙げ句、原因は「$hが変数として解釈されていない」ことであると判明。どうも「$h:」までを変数と解釈して、展開しようとしているみたいなのです。なので「$p」を消して「http://$h」とすると期待通りの動作となります。あと、「$h」の後に空白を入れた場合もうまいこと解釈されるようです。
PS F:\> echo "http://$h" http://foo.com PS F:\> echo "http://$h $p" http://foo.com 80 PS F:\> echo "http://$h$p" http://foo.com80 PS F:\> $hx = "var.com" PS F:\> echo "http://$hx$p" http://var.com80
まぁ、確かに、どこまでを変数とすべきか判断が難しそうなのは解るけど、だったら識別できるような文法にしようよー。
で、対策
さて、原因がわかったとはいえ、「:」をスペースに置き換える訳にもいかないので、今回は次のようにして回避。
PS F:\> echo ("http://"+$h+":"+$p) http://foo.com:80
なんか、メンドウだなー。