2010年11月29日月曜日

◆PSCustomObjectは難しい?(Compare-Objectは難しい改)

PowerShell: ◆Compare-Objectは難しい?で思い通りの出力結果にならず思い悩んだが、S.K.さんからコメントを頂き、問題の本質が見えてきた。

001
002
003
004
005

$oldps = ps
notepad
 
$newps = 
ps
diff
 $oldps $newps 
diff $oldps $newps | gm

此の様に書いたとき、Get-Memberの出力が表示されず悩んでいたのだが、これはPowerShell: ◆コンソール出力のオブジェクトマージ機能を回避するで書いたのと同様の問題のようだ。
以下のようにOut-Hostを追加することで期待通りの結果が得られた。

001
002
003
004
005

$oldps = ps
notepad
 
$newps = 
ps
diff
 $oldps $newps 
diff $oldps $newps | gm | Out-Host

出力オブジェクトが同じ型の時にマージされるのが本当だと思うのだが、diffの結果として出力されるPSCustomObjectはそれ以降の出力オブジェクトをすべて巻き込んでしまう。
すなわち、PSCunsomObjet以降の出力はすべて同じ型であると判定されているようだ。

試しに同じPSCunsomObjetを出力するImport-CSVコマンドレットを使って以下のように書いてみた。

結果は先頭にCSVの内容を表示した後、空白行が続く。

001
002
003
004
005
006
007
008
009
010

#"★dir表示"
#dir | select -First 2
#"★ps表示"
#ps | select -First 2

"★★★CSV表示"
Import-Csv d:\Desktop\test.csv
"★dir表示"
dir | select -First 2
"★ps表示"
ps | select -First 2
20101129110823

コメントを外すと。
20101129111112

期待通りの結果になる。
先頭にPSCustomObjectが来るとダメっぽい。

これが仕様だとすると、嵌ること請け合いの仕様だ。

思い通りに出力されないときは「Out-Host」と覚えておこうっと。

0 件のコメント:

コメントを投稿