我在PowerShell

时间:2017-01-18 00:54:08

标签: powershell

我有几百台运行不同版本的MS Office的计算机。我需要找到哪些机器正在运行什么版本。我有一个powershell脚本,我能够获取并将安装了MS Office的计算机的名称导出到csv文件,但是我无法在计算机上安装Office的版本以便导出到csv。我正在使用的代码如下:

$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

3 个答案:

答案 0 :(得分:1)

您没有存储版本信息以便在Get-WmiObject ...行中重复使用。

获得所需结果的方法是将get-wmiobject调用的结果存储到变量中,然后使用点表示法来获取所需的特定属性。

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

通常情况下,如果您计划稍后在脚本上重新使用该对象,则使用select,in-line格式化对象是不好的做法。作为一般指导,我会将原始对象数据存储在变量中,然后在该行之后格式化该变量。

# 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
}

答案 1 :(得分:0)

像野蛮解释你一样,你不存储你的wmi命令的结果。 我简化了你这样的代码

Dim leftPaddingHex As Long = Val("&H" & "99000533")
If leftPaddingHex < 0 Then
  leftPaddingHex = leftPaddingHex + UInt32.MaxValue + 1
End If

答案 2 :(得分:0)

感谢您提供的信息。我只是让它变得比它需要的更难,最终能够通过更改脚本来获取所需的数据,取出所有单元格信息并直接导出到文本文件。

$$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 
}