2009-09-02 4 views
7

は、スクリプトがその出力オブジェクトにDefaultDisplayPropertySetを設定する方法について説明カーク・マンローからブログ記事です:PowerShell v2スクリプトでオブジェクトのDefaultDisplayPropertySetを設定できますか?ここ

Essential PowerShell: Define default properties for custom objects

彼のテクニックと例のコードは、PowerShellのv2の中で動作するように表示されません。 (PowerTabとPSCXがインストールされていることに注意してください)

PowerShell v2でこれを動作させる方法を知っていますか?


UPDATE:ここ は(私は単一引用符を修正しましたノート、)私のために働いていないブログ記事からの例です:

$myObject = New-Object PSObject 
$myObject | Add-Member NoteProperty Name 'My Object' 
$myObject | Add-Member NoteProperty Property1 1 
$myObject | Add-Member NoteProperty Property2 2 
$myObject | Add-Member NoteProperty Property3 3 
$myObject | Add-Member NoteProperty Property4 4 
$myObject | Add-Member NoteProperty Property5 5 
$myObject 

    ## Output: 
    # Name  : My Object 
    # Property1 : 1 
    # Property2 : 2 
    # Property3 : 3 
    # Property4 : 4 
    # Property5 : 5 

$defaultProperties = @('Name','Property2','Property4') 
$defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultProperties) 
$PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet) 
$myObject | Add-Member MemberSet PSStandardMembers $PSStandardMembers 
$myObject 

    ## Output: 
    # Name  : My Object 
    # Property1 : 1 
    # Property2 : 2 
    # Property3 : 3 
    # Property4 : 4 
    # Property5 : 5 

出力はすべきではありませんDefaultDisplayPropertySetを追加した後も同じです(つまりName、Property2、およびProperty4のみが必要です)。

+0

I Sまた、Microsoft Windows Management Framework RCを介して、Vista上でPowerShell v2を実行していることに気づくでしょう。 http://blogs.msdn.com/powershell/archive/2009/08/14/powershell-2-0-for-windows-vista-and-windows-server-2008-release-candidate.aspx – totorocat

答えて

6

使用できないコードの例を挙げることはできますか?これはv2で完全に動作するはずです。そうでなければ、バグを見つけました。

UPDATE:

(引用について削除コメント)

私は、これは確かに回帰(バグ)であることをPowerShellチームで確認しました。あなたがここにあなたの問題の重要性に投票でき

https://connect.microsoft.com/PowerShell/feedback/ViewFeedback.aspx?FeedbackID=487938

おかげで、

-Oisin(PowerShellのMVP)

+0

私は持っていましたすでに無効な一重引用符文字と二重引用符文字に気づき、修正しました。元の質問に実際のサンプルコードを追加しました。それはあなたのために働くのですか? – totorocat

+0

訂正:単引用符だった。 – totorocat

+0

更新された回答:v2.0のバグです – x0n

0

あなたがそうであるように、私は同じ結果を得ます - 5つのプロパティすべてを表示します。私はVista上でPowershell 2.0 RCを実行しています。 PowerTabまたはPSCXがインストールされていません。ここで

+0

問題を確認するために時間を割いてくれてありがとう... – totorocat

2

は、私はこの問題を回避するために作成したソリューションです:

function Set-PSObjectDefaultProperties { 
param(
     [PSObject]$Object, 
     [string[]]$DefaultProperties 
    ) 

$name = $Object.PSObject.TypeNames[0]  

$xml = "<?xml version='1.0' encoding='utf-8' ?><Types><Type>" 

$xml += "<Name>$($name)</Name>" 

$xml += "<Members><MemberSet><Name>PSStandardMembers</Name><Members>" 

$xml += "<PropertySet><Name>DefaultDisplayPropertySet</Name><ReferencedProperties>" 

foreach($default in $DefaultProperties) { 
    $xml += "<Name>$($default)</Name>" 
} 

$xml += "</ReferencedProperties></PropertySet></Members></MemberSet></Members>" 

$xml += "</Type></Types>" 

$file = "$($env:Temp)\$name.ps1xml" 

Out-File -FilePath $file -Encoding "UTF8" -InputObject $xml -Force 

$typeLoaded = $host.Runspace.RunspaceConfiguration.Types | where { $_.FileName -eq $file } 

if($typeLoaded -ne $null) { 
    Write-Verbose "Type Loaded" 
    Update-TypeData 
} 
else { 
    Update-TypeData $file 
} 

}

今、あなたはあなたのカスタムオブジェクトを作成して、PowerShellのV2でのデフォルトのプロパティを設定するために使用することができます以下

$myObject = New-Object PSObject 
$myObject | Add-Member NoteProperty Name 'My Object' 
$myObject | Add-Member NoteProperty Property1 1 
$myObject | Add-Member NoteProperty Property2 2 
$myObject | Add-Member NoteProperty Property3 3 
$myObject | Add-Member NoteProperty Property4 4 
$myObject | Add-Member NoteProperty Property5 5 
$myObject 

    ## Output: 
    # Name  : My Object 
    # Property1 : 1 
    # Property2 : 2 
    # Property3 : 3 
    # Property4 : 4 
    # Property5 : 5 

$defaultProperties = @('Name','Property2','Property4') 

Set-PSObjectDefaultProperties $myObject $defaultProperties 

$myObject 

    ## Output: 
    #Name   Property2   Property4 
    #----   ---------   --------- 
    #My Object  2     4 

それはPoshCode経由でも利用可能です:Set-PSObjectDefaultProperties

+0

サンプルコードは私のために働いていましたが、残念ながらこの方法はプロジェクト(PowerShell v3.0)では機能しませんでした。あなたがしたことは賢明です - 関数は、PSCustomObjectのデフォルトの書式を置き換えます。しかし、私はこれから派生するいくつかのオブジェクトを持っています。私はおそらくps1xmlファイルを書くつもりだ。私に何かを学ばせるための+1。 – JamesQMurphy

+0

このような連結の代わりにhere-stringを検討してください。 – jpmc26

関連する問題