首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象添加到数组以创建多列

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

Stack Overflow用户
提问于 2015-07-15 00:19:31
回答 1查看 10.7K关注 0票数 1

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

代码语言:javascript
复制
$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中的第一台计算机。我试着一步一步地了解它,我就是不明白为什么不能用不同的Name属性将$Obj变量添加到$Results中(在本例中,我循环并根据.txt文件中的计算机名创建一个新名称)。它似乎只接受第一个输入,不会放入一个新的列标题,然后输出软件。下面是我得到的和我想要得到的东西的一个例子。

输出

代码语言:javascript
复制
A01234
Program1
Program2
Program3

预期输出

代码语言:javascript
复制
A01234     B05678      C09123
Program1   Program97   Program30
Program2   Program98   Program31
Program3   Program99   Program32

希望这是有意义的。任何帮助都将不胜感激,我显然对这些对象做了一些错误的事情,但我看不到它。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 02:14:32

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

代码语言:javascript
复制
$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代码行,因为这部分至少对你有效。这应该会得到您正在寻找的列表。我的代码结果如下:

代码语言:javascript
复制
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              
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31412095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档