2017-08-29 22 views
1

既存のオブジェクトからカスタムオブジェクトを作成しようとしています。しかし、私はこれを行う最善の方法を把握していないようです。PowerShellで既存のオブジェクトからカスタムオブジェクトを作成する

私の目標は、アプリケーション名のすべての値を持つコンピュータ名ごとにカスタムオブジェクトを作成することです。

これを実現するためにforeachまたはwhere句を使用する必要があるかどうかわかりません。また、正しい構文を使用するかどうかもわかりません。

ありがとうございました。既存のオブジェクトで

データは次のようになります。

コンピュータ名、IPアドレス、アプリケーション名

host1,10.10.10.10、Firefoxの

host1,10.10.10.10、クロム

host1,10.10.10.10、インターネットエクスプローラ

host2,11.11.11.11、firefox

host2,11.11.11.11、クロム

host2,11.11.11.11、オペラ

コード例:私は願ってい

foreach ($global:ComputerName in $global:SNWReportObject."Computer name"){ 
    if ($_ -eq $global:ComputerName) { 
     Add-Member -InputObject $global:NEWReportObject -MemberType NoteProperty -Name ApplicationName -Value $global:SNWReportObject."Application name" 
    } 

} 

結果:

コンピュータ名、アプリケーション名

host1が、Firefoxの、クロム、Internet Explorerの

host2の、Firefoxの、クロム、オペラ

答えて

1

編集:私たちは中に文字列の配列で作業しているので、
は、だからあなたの実際のケースは少し変でしたハッシュテーブルではなくカスタムオブジェクトです。次のコードスニペットは、オブジェクトを扱いやすい[HashTable]に変換します。仮定:で作業

Set-Content -Path C:\Temp\file.csv -Value 'Computer Name,Application Name' 
$Hash.Keys | 
    ForEach-Object 
    { 
     Add-Content -Path C:\temp\file.csv -Value "$_,$($Hash.$_.Application -join ',')" 
    } 

$Hash.Host1.Application

、ご希望の出力を取得するには:すべての入力データは、この整形

<# Example.csv 
Computer name,IP-Address,Application 
host1,10.10.10.10,firefox 
host1,10.10.10.10,chrome 
host1,10.10.10.10,internet explorer 
host2,11.11.11.11,firefox 
host2,11.11.11.11,chrome 
host2,11.11.11.11,opera 
#> 
$Csv = Import-Csv -LiteralPath C:\Temp\Example.csv 
[HashTable][email protected]{} 

For ($i = 0; $i -lt ($Csv.'Computer name').Count; $i++) 
{ 
    If ($Hash.ContainsKey($Csv.'Computer name'[$i])) 
    { 
     $Hash.($Csv.'Computer name'[$i]).Application += $Csv.Application[$i] 
     Continue 
    } 
    $Hash.($Csv.'Computer name'[$i]) = @{ 
     Application = @($Csv.Application[$i]) 
    } 
} 

は、今すぐあなたのメンバーがとても似アクセス可能ですa [PSCustomObject]、あなたのメンバーはあなたができることにはかなり制限されています。ここでは、標準的なメンバー(無視する)は次のとおりです。これを知っ

TypeName: System.Management.Automation.PSCustomObject 

Name  MemberType Definition 
----  ---------- ---------- 
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode() 
GetType  Method  type GetType() 
ToString Method  string ToString() 

、コピーする残りの部分を解析することができます

$Comp = @('Equals','GetHashCode','GetType','ToString' 
[HashTable][email protected]{} 
($Object | Get-Member).Name | 
    ForEach-Object { 
     If ($_ -notin $Comp) {$CopyObject.$_ = $Object.$_} 
    } 
+0

これは有用であるが、それは非常に私が望んでいたものを達成しませんでしたために。私の目標は、その下にリストされていたすべてのアプリケーションを含む1つのコンピュータ名が存在するところに最終的な出力を作成することでした。私が受け取った結果は、すべてのコンピュータ名の一覧と、重複を含むすべてのアプリケーションの一覧でした。 – MrMr

+0

@MrMr元のオブジェクトは '.csv'ファイルですか? – TheIncorrigible1

+0

はい、もともとは.csv – MrMr

関連する問題