2017-01-18 4 views
1

Ich habe ein paar hundert Maschinen, die verschiedene Versionen von MS Office ausgeführt werden. Ich muss herausfinden, welche Maschinen welche Versionen ausführen. Ich habe ein Powershell-Skript, ich bin in der Lage, die Namen der Maschinen zu erhalten und zu exportieren, die MS Office in einer CSV-Datei installiert haben, aber ich habe Probleme, die Office-Version auf den Maschinen zu installieren, um auch in den CSV zu exportieren. Der Code I bin mit unten aufgeführt:Ich habe ein wenig Probleme in PowerShell

$Computers = Get-Content "\\networkpath\ComputerList.txt" 
$csvFilePath = "\\networkpath\SoftwareList.csv" 

if (!(Test-Path -path $csvFilePath)) { ""|select name,version | Export-Csv -Path $csvFilePath -NoTypeInformation} 

$outputArray = New-Object -TypeName System.Collections.ArrayList 


ForEach ($Computer in $Computers) 
{ 
     Get-WmiObject -computerName $computer -Class CIM_Product -Filter 'Name like "%Microsoft Office Professional Plus%"' | select name 


$Version = select name 
$row = ""|select name,version 
$row.Name = $Computer.ToString() 
$row.Version = $Version.ToString() 
$outputArray.Add($row) 
     } 



$outputArray | Export-Csv -Path $csvFilePath -NoTypeInformation #-Append 

Antwort

1

Sie sind nicht die Versionsinformationen für die Wiederverwendung in Ihrer Get-WmiObject ... Linie zu speichern.

Eine Möglichkeit, die gewünschten Ergebnisse zu erzielen, wäre, die Ergebnisse des get-wmiobject-Aufrufs in einer Variablen zu speichern und dann die Punktnotation zu verwenden, um die gewünschten spezifischen Eigenschaften zu erhalten.

$wmiObject = get-wmiobject win32_product .... 
$wmiObject.Name 
$wmiObject.Version 

Normalerweise ist es schlechte Praxis Ihre Objekte mit ausgewählten formatieren, in-line, wenn Sie sich auf das Wiederverwenden das Objekt später auf der ganzen Skript planen. Als allgemeine Anleitung würde ich die rohen Objektdaten in einer Variablen speichern und diese Variable später in der Zeile formatieren.

# declare your array  
$outputarray = @() 

# loop through your collection, build the custom psobject, and add it to your output array 
foreach ($computer in $computers) { 
    $wmiObject = get-wmiobject -computername $computer | where name -like 'Microsoft Office Proffesional Plus*' 
    $obj = new-object -typename psobject 
    $obj | add-member -membertype noteproperty -name 'Name' -value $wmiObject.name 
    $obj | add-member -membertype noteproperty -name 'Version' -value $wmiObject.version 
    $outputarray += $obj 
} 
0

wie wild erklären Sie, Sie speichern nicht Ergebnis Ihres wmi Befehls. Ich habe dich wie dies für die Informationen

$Computers = Get-Content "\\networkpath\ComputerList.txt" 
$csvFilePath = "\\networkpath\SoftwareList.csv" 

$Computers | 
    %{Get-WmiObject -computerName $_ -Class CIM_Product -Filter 'Name like "%Microsoft Office Professional Plus%"' | select PSComputerName, Name, Version} | 
     Export-Csv $csvFilePath -NoTypeInformation 
+0

Vielen Dank für die Informationen. – Jason

0

Dank Code vereinfacht. Ich machte es nur schwerer als das, was es sein musste und war letztendlich in der Lage, die benötigten Daten zu bekommen, indem ich das Scripting änderte und alle Zellinformationen herausnahm und direkt in eine Textdatei exportierte.

$$Computers = Get-Content "\\networkpath\ComputerList.csv" 
$FilePath = "\\networkpath\SoftwareList.txt" 

if (!(test-path $FilePath)){New-Item -Path $FilePath} 
ForEach ($computer in $Computers) 
{ 
$Result1 = Get-WmiObject -ComputerName $computer -Class CIM_Product -Filter 'Name like "%Microsoft Office Professional Plus%"' | select Name,Version 
$Result2 = Get-wmiobject Win32_computersystem -computer $computer | select name 
$Result += $Result2, $Result1 | Out-File -FilePath $Filepath -Append 
} 
Verwandte Themen