我试图从现有对象创建自定义对象。但是,我似乎无法找到最佳方法。
我的目标是为每个计算机名称创建一个自定义对象,该名称将具有“应用程序名称”中的所有值。
我不确定是否应该使用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,火狐,铬,歌剧
答案 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.$_}
}