如何使用powershell将计算机名称和应用程序信息导出到csv

如何使用powershell将计算机名称和应用程序信息导出到csv,powershell,csv,Powershell,Csv,我正在尝试创建一个简单的PS脚本,用于SolarWinds,它将把这个脚本推出并在一堆计算机上运行。基本上,我需要它来导出机器名,并告诉我安装在计算机上的特定软件版本。想想软件审计。例如,我有5台电脑。我想让这个脚本在所有5台机器上运行,并将数据附加到一个csv文件中,显示它们的机器名、应用程序名和应用程序版本,仅适用于名称中包含“Office”的应用程序 $Results = Get-ItemProperty HKLM:\Software\Microsoft\Windows\Curren

我正在尝试创建一个简单的PS脚本,用于SolarWinds,它将把这个脚本推出并在一堆计算机上运行。基本上,我需要它来导出机器名,并告诉我安装在计算机上的特定软件版本。想想软件审计。例如,我有5台电脑。我想让这个脚本在所有5台机器上运行,并将数据附加到一个csv文件中,显示它们的机器名、应用程序名和应用程序版本,仅适用于名称中包含“Office”的应用程序

$Results =  
 Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
 Select-Object $env:computername, displayName, DisplayVersion |
 where-object {$_.DisplayName -match 'office'}
 $Results | Export-CSV -Append -Path \\filepath\office.csv -NoTypeInformation 
预计如果这在5台或更多计算机上运行,我将得到一个csv文件,当在excel中打开该文件时,将为我提供3列数据。第一列是该计算机的计算机名,下一列是应用程序名,第三列是应用程序版本。这些计算机都将附加到同一个csv文件中,因此最后我有一个包含该应用程序及其版本的所有计算机的列表

我可以让它在一台计算机上工作,但当我尝试在多台计算机上运行它时,它不会附加到同一个csv文件


问题是机器名只是变成了列名,而不是用数据填充机器名列。

最好使用invoke命令来获取远程数据

$export = @()
$computers = Get-Content Machines.txt

foreach($computer in $computers){
$Results = @()
$Results = Invoke-Command -ComputerName $computer -ScriptBlock { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* | Select-Object $computer, displayName, DisplayVersion | where-object {$_.DisplayName -match 'office' } }

$Results += $export
}

$export | Export-CSV -Append -Path \filepath\office.csv -NoTypeInformation
根据我的评论:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object @{l='ComputerName';e={$env:computername}},DisplayName,DisplayVersion |
    Where-Object {$_.DisplayName -match 'office'}

此处的收益率(短路):


如果您想直接进入Excel,
Install Module ImportExcel


修改您的
Select Object
以插入计算属性=>
Select Object@{Label='ComputerName';Expression={$env:ComputerName}},DisplayName,DisplayVersion
这是正确的脚本吗?因为$env:computername不是您正在收集的对象的成员。@LotPings只对我有用。谢谢,我认为这不会完全起作用,因为我不是从文本文件中提取机器名,而是使用solarwinds在所有机器上独立运行它。这有意义吗?然而,我认为这已经接近我所需要的了。
$Results+=$export
应该是相反的<代码>$export+=$Results。最好将整个foreach分配给$export,收集所有输出,不需要中间的$Results。
ComputerName DisplayName            DisplayVersion
------------ -----------            --------------
MY-PC        HP Officejet Pro 8500  28.0..
MY-PC        LibreOffice 6.2.5.2    6.2...
MY-PC        Office 16 Click-to-Run 16.0...
MY-PC        Office 16 Click-to-Run 16.0...