2017-09-11 21 views
0

PSCustomObjectsで塗りつぶすPowerShellの配列$Sessions = @()があります。配列自体にカスタムプロパティを追加するにはどうしたらいいですか?例えば。私は$Sessions.Countを内蔵していて、アクティブなセッション数に設定したいのは$Sessions.Activeです。PowerShellアレイにカスタムプロパティを追加する方法は?

私は

$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime 

で(汚いやり方で)PSCustomObjectsにプロパティを追加することができます知っているが、配列にそうすることは追加されているプロパティをもたらさないであろうけれども。

どうすれば目標を達成できますか?カスタム配列を作成する方法はありますか?

+2

ただ、 'アドインを使用メンバ-InputObject $ sessions ... '?これは、 – Matt

+0

の配列であることに注意してください。( '$ sessions + = ...')は配列を置き換え、追加のプロパティを削除します。より安全なアプローチは、配列と状態の異なるプロパティを持つカスタムオブジェクトです。あなたがこれを使いたいものによっては、リストにプロパティを追加するのではなく、異なるリスト変数 '$ activeSessions' /' $ inactiveSessions'を使う方が適切かもしれません。個々のセッションオブジェクト –

+0

@Matt答えとしてポストしてしまえば...私は実際に私の解決策から私を守ってくれた怠けから 'Select-Object'を酷使しました。ありがとう。 @AnsgarWiechersは '+ ='についてのヒントのおかげで、 'Add-Member'呼び出しの間違いを解消できました。 – FatalMerlin

答えて

3

あなたの質問に対する回答は、配列オブジェクトにAdd-Memberを使用することになります。あなたはが類似しているオブジェクトを作成した後

Add-Member -InputObject $sessions -MemberType NoteProperty -Name "State" -Value "Fabulous" 

各要素にプロパティを追加します。

$sessions | ForEach-Object{ 
    $_ | Add-Member -MemberType NoteProperty -Name "State" -Value "Fabulous" 
} 

これはもちろん警告です(私は忘れてしまったものです)。コメント

注意してくださいが、その配列($ sessions + = ...)に追加すると配列が置き換えられ、追加のプロパティが削除されます。

Ansgar Wiechers

ご利用の場合によってはあなたが欲しい欲しい取得するための他のオプションがあります。あなたは明確な変数に配列要素を保存することができます:

# Check the current object state 
$state = $object.Property ..... 

# Add to the appropriate array. 
if($state -eq "Active"){ 
    $activeSessions += $object 
} else { 
    $inactiveSessions += $object 
} 

あるいは必要に応じて、あなたはまだWhere-Objectであなたの国有財産とポストプロセスを格納することができ:

# Process each inactive session 
$sessions | Where-Object{$_.State -eq "Active"} | ForEach-Object{} 

配列の問題を再作成/破壊を避けるために、そのことができますパフォーマンスを向上させるには、代わりに配列リストを使用することもできます。

$myArray = New-Object System.Collections.ArrayList 
Add-Member -InputObject $myArray -MemberType ScriptMethod -Name "NeverTellMeTheOdds" -Value { 
    $this | Where-Object{$_ % 2 -ne 0} 
} 

$myArray.AddRange(1..10) 
$myArray.NeverTellMeTheOdds() 

配列にメンバーが追加され、その要素が追加されていることに注目してください。

1

Mattさんがコメントしたように、-InputObjectパラメータの位置引数として数値を入力すると、Add-Memberを列挙型に使用できます。

代わり@()のジェネリックListを使用し、新しいプロパティを追加した後のサイズ変更を可能にするには、次の

$list = [System.Collections.Generic.List[psobject]]::new() 
$list.AddRange(@(
    [pscustomobject]@{SessionId = 1; Active = $true} 
    [pscustomobject]@{SessionId = 2; Active = $false} 
    [pscustomobject]@{SessionId = 3; Active = $true} 
) -as [psobject[]]) 

Add-Member -InputObject $list -MemberType ScriptProperty -Name ActiveSessionCount -Value { 
    return @($this |? Active -eq $true).Count 
} 

今、あなたは簡単にアクティブなセッション数を取得することができます。

PS C:\> $list.ActiveSessionCount 
2 
+1

私はarraylistを提案しました。似ていると思う。 – Matt

関連する問題