将对象添加到数组以创建多个列

时间:2015-07-14 16:19:31

标签: powershell

我正在尝试为每台计算机获取AddRemovePrograms中列出的所有软件的DisplayName,将其添加到计算机名称下的数组中,然后导出。这就是我所拥有的:

$Computers = gc "C:\Get Software.txt"
$CSV = "C:\Get Software.csv"
$Results = @()

If (Test-Path $CSV) {
    Remove-Item $CSV
    }

Foreach($Computer in $Computers){

    #Get DisplayName of Software Installed on Asset
    $Software = Get-WmiObject Win32Reg_AddRemovePrograms -ComputerName $Computer | Select-Object -ExpandProperty DisplayName
    $counter = 0

    While ($counter -lt $Software.count){

    #Create a PSObject. Loops through all software and adds to $Results.
    $Obj = New-Object PSOBJECT
    Add-member –inputobject $Obj –membertype Noteproperty  -Name $Computer -Value $Software[$counter]
    $counter++
    $Results+=$Obj
    }




}


$Results | Export-Csv $CSV -NoTypeInformation

不幸的是,输出只列出了CSV中的第一台计算机。我已经尝试逐步理解它,我只是不明白为什么我不能将$ Obj变量添加到$ Results使用不同的Name属性(在这种情况下,我循环并根据新的名称创建一个新名称)我的.txt文件中的计算机名称)。它似乎只接受第一个输入,并且不会添加新的列标题然后吐出软件。以下是我所得到的以及我想要获得的内容的一个例子。

输出

A01234
Program1
Program2
Program3

预期输出

A01234     B05678      C09123
Program1   Program97   Program30
Program2   Program98   Program31
Program3   Program99   Program32

希望这有一定道理。任何帮助将不胜感激,我显然对这些对象做错了,我没有看到它。谢谢!

1 个答案:

答案 0 :(得分:2)

这是可行的,它并不像你想象的那么简单。我建议将其设置为散列表,其中键是您的计算机名称,您的值是每台计算机的软件标题数组。然后你会发现拥有最多软件的计算机有多少个标题(这是你将拥有多少行,所以这是你需要循环多少次),并创建一个循环来制作那么多对象。每个对象都没有要启动的属性,然后我们为散列表中的每台计算机添加一个属性,该属性的值将是该计算机的散列表中列出的第N个项目。这是代码,它可能会使这一切变得更有意义:

$Computers = 'A01234','B05678','C09123'

$SftwrPerCmp = [ordered]@{}

ForEach($Computer in $Computers){
    $SftwrPerCmp.add($Computer,@())

    #Randomly generate 7-15 strings as 'Programs' for current computer
    $Software = 1..$(get-random -Maximum 15 -Minimum 7)|%{(Get-Random -inputobject $("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -split ''|?{$_}) -count 6) -join ''}

    ForEach($Title in $Software){
        $SftwrPerCmp["$Computer"] += $Title
    }
}

$MaxTitleCount = $SftwrPerCmp.Values|%{$_.count}|sort|select -last 1

$Results = @()
For($i=0;$i -lt $MaxTitleCount;$i++){
    $Record = New-Object PSObject
    $SftwrPerCmp.Keys | ForEach{Add-Member -InputObject $Record -NotePropertyName $_ -NotePropertyValue $SftwrPerCmp["$_"][$i]}
    $Results += $Record
    Clear-Variable Record
}

$Results|Format-Table -AutoSize

现在很明显,您不会随机生成软件标题,而是使用您现有代码中的现有$Software = Get-WmiObject行,因为该部分至少为您工作。这应该会导致您要查找的商家信息。我的代码导致了这个:

A01234 B05678 C09123
------ ------ ------
CU7K5E 6GJWOB 97H1TY
7VCZ5T CIPWVK 760NKU
CHKPY0 J4B7D0 1QOSD3
2YEFR4 2VY6DM O68SKU
VI7ZQG WLJQN9 Q5VJAZ
ZQOKNV R9KZG1 H2XZK4
S8IZC4 GRSMPU BIZXKA
LAVNI0 TKBOUC K9DEFU
3U7KVO        JZ3X4H
A6GVUK        18AC5H
NMI32Q        H14GPJ
50KSZ6        XU0FWC
PAN5TC        9WXR5U
531M04