Это должно получить работу, если я интерпретировал намерение код правильно:
$Servers = Get-Content "c:\temp\HH_Servers.txt"
$arr = @()
foreach ($Server in $Servers){
$GenItems2 = gwmi Win32_OperatingSystem -Comp $Server
$Software = gwmi Win32_Product -Comp $Server
#Populate Software Sheet
foreach ($objItem in $Software){
$temp = New-Object psobject
$temp | Add-Member -MemberType NoteProperty -Name "Server" -Value $objItem.__SERVER
$temp | Add-Member -MemberType NoteProperty -Name "Caption" -Value $GenItems2.Caption
$temp | Add-Member -MemberType NoteProperty -Name "ServicePack" -Value $GenItems2.CsdVersion
$temp | Add-Member -MemberType NoteProperty -Name "Name" -Value $objItem.Name
$temp | Add-Member -MemberType NoteProperty -Name "Vendor" -Value $objItem.Vendor
$temp | Add-Member -MemberType NoteProperty -Name "Version" -Value $objItem.Version
$arr += $temp
}
}
$arr | Export-Csv C:\whatever\SoftwareInfo.csv -NoTypeInformation -Encoding ASCII
Я также позволил себе добавить дополнительное свойство, которое включает в себя пакет обновления уровень операционной системы (может также представлять интерес). Если вам не нужно, просто удалите строку, которая добавит свойство ServicePack
.
В случае, если производительность важна, вы также можете пересмотреть использование wmi полностью с момента его сверхмедленности. Если вы хотите узнать об альтернативах, вот хорошая статья от сценариста, который обсуждает вопрос: Use PowerShell to Find Installed Software
Пожалуйста, не используйте кнопку кода фрагмента кода при добавлении кода; это для JavaScript (я знаю, что в подсказке это не сказано). Вместо этого используйте кнопку «Пример кода» (два слева на панели инструментов - это выглядит как '{}') или просто выберите весь свой код и нажмите Ctrl + K. Я исправил форматирование здесь (как и в предыдущем вопросе). :-) –