2017-08-29 94 views
1

我試圖從現有對象創建自定義對象。但是,我似乎無法弄清楚這樣做的最佳方式。PowerShell從現有對象創建自定義對象

我的目標是爲每個計算機名稱創建一個自定義對象,該對象將具有來自應用程序名稱的所有值。

我不確定是否應該使用foreach或where子句來實現此目的,而且我也不確定使用哪種正確的語法。

在此先感謝您的幫助。

在現有對象中的數據是這樣的:

計算機名稱,IP地址,應用名稱

host1,10.10.10.10,火狐

host1,10.10.10.10,鉻

host1,10.10.10.10,internet explorer

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" 
    } 

} 

結果我希望的:

計算機名稱,應用程序名稱

主機1,火狐,Chrome,IE瀏覽器

主機2,火狐,Chrome,歌劇

回答

1

編輯:
因此您的實際情況是有點怪異,因爲我們在字符串數組工作一個自定義對象而不是一個哈希表。下面的代碼片段將把你的對象變成一個易於使用的[HashTable]。假設:所有輸入數據是這樣形成良好

<# 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]) 
    } 
} 

現在你的成員都可以訪問,像這樣:$Hash.Host1.Application

要得到你想要的輸出:

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 ',')" 
    } 

當工作一個[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() 

知道了這一點,您可以通過REST解析複製:

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

雖然這是非常有用的,它並沒有完全完成我希望對於。我的目標是創建最終輸出,其中將包含一個計算機名稱,其中包含所有列在其下的應用程序。我收到的結果是所有計算機名稱的列表以及所有包含重複項的所有應用程序的列表。 – MrMr

+0

@MrMr你的原始對象是一個'.csv'文件嗎? – TheIncorrigible1

+0

是的,它最初是一個.csv – MrMr