2010年7月20日火曜日

◆$a = $b と $a | set b の違い

PowerShell: ◆XMLファイルを扱うで表題の違いに気付かず戸惑ったが原因が判ったのでメモしておく。
PS>$b = @(1)
PS>$a = $b
PS>$a | set c
PS>$a.ToString()
System.Object[]
PS>$c.ToString()
1

この例をみると明らかに両者が等価でないことが判る。
もともとObject配列だったものがパイプラインを通ることによりInt型に変化している。
配列の個数が1個か複数かで結果の型が変わる例である。
この様に、$a = $b は明らかに等価な代入であるがパイプラインを通した場合は中身が展開されるので必ずしも等価とは限らない。
ちなみに、$aの前にカンマを付けて
,$a | set c
とすると同じ結果を得ることができる。
PowerShell: ◆XMLファイルを扱うの例でいくと、
$xml.SelectNodes($query) | Set-Variable node
とした場合、$xml.SelectNodes($query)はSystem.Xml.XPathNodeList型なのだが、その要素が一つなためnode変数はSystem.Xml.XmlElement型となる。
なので、そのプロパティである”#text”が参照できた。
では、$xml.SelectNodes($query)の方はどうやって参照するかというと
PS>,$xml.SelectNodes($query) | gm
   TypeName: System.Xml.XPathNodeList
Name          MemberType            Definition
----          ----------            ----------
ToString      CodeMethod            static string XmlNodeList(psobject instance)
Equals        Method                bool Equals(System.Object obj)
GetEnumerator Method                System.Collections.IEnumerator GetEnumerator()
GetHashCode   Method                int GetHashCode()
GetType       Method                type GetType()
Item          Method                System.Xml.XmlNode Item(int index)
ItemOf        ParameterizedProperty System.Xml.XmlNode ItemOf(int i) {get;}
Count         Property              System.Int32 Count {get;}

これで判るように、ItemもしくはItemOfを使えばよさそうだ。
PS>$xml.SelectNodes($query).itemof(0)."#text"
佐藤
PS>$xml.SelectNodes($query).item(0)."#text"
佐藤

0 件のコメント:

コメントを投稿