PowerShell从现有对象创建自定义对象

时间:2017-08-29 16:33:02

标签: arrays powershell object

我试图从现有对象创建自定义对象。但是,我似乎无法找到最佳方法。

我的目标是为每个计算机名称创建一个自定义对象,该名称将具有“应用程序名称”中的所有值。

我不确定是否应该使用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,火狐

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,chrome,internet explorer

主机2,火狐,铬,歌剧

1 个答案:

答案 0 :(得分: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]$Hash=@{}

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()

知道了这一点,你可以解析其余部分来复制:

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