我正在尝试获取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中的第一台计算机。我试着一步一步地了解它,我就是不明白为什么不能用不同的Name属性将$Obj变量添加到$Results中(在本例中,我循环并根据.txt文件中的计算机名创建一个新名称)。它似乎只接受第一个输入,不会放入一个新的列标题,然后输出软件。下面是我得到的和我想要得到的东西的一个例子。
输出
A01234
Program1
Program2
Program3预期输出
A01234 B05678 C09123
Program1 Program97 Program30
Program2 Program98 Program31
Program3 Program99 Program32希望这是有意义的。任何帮助都将不胜感激,我显然对这些对象做了一些错误的事情,但我看不到它。谢谢!
发布于 2015-07-15 02:14:32
这是可行的,只是不像你想象的那么简单。我建议将其设置为一个哈希表,其中键是您的计算机名称,您的值是每台计算机的软件标题数组。然后找出安装了最多软件的计算机有多少标题(这就是你将有多少行,所以这是你必须循环的次数),并创建一个循环来创建这么多对象。每个对象都没有要启动的属性,然后我们在哈希表中为每台计算机添加一个属性,该属性的值将是该计算机在哈希表中列出的第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 https://stackoverflow.com/questions/31412095
复制相似问题