【问题标题】:How to export machine name, and application info to csv using powershell如何使用 powershell 将机器名称和应用程序信息导出到 csv
【发布时间】:2019-09-05 13:32:41
【问题描述】:

我正在尝试创建一个简单的 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 文件。

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

【问题讨论】:

  • 修改您的 Select-Object 以插入计算属性 => Select-Object @{Label='ComputerName';Expression={$env:computername}},DisplayName, DisplayVersion
  • 那是确切的脚本吗?因为 $env:computername 不是您正在收集的对象的成员。
  • @LotPings 对我有用。谢谢

标签: powershell csv


【解决方案1】:

根据我的评论:

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

这里的收益(做空):

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...

【讨论】:

    【解决方案2】:

    最好使用invoke-command来获取远程数据。

    $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
    

    【讨论】:

    • 我认为这不会完全有效,因为我不是从文本文件中提取机器名称,而是使用 solarwinds 在所有机器上独立运行它。如果这有意义吗?但是我认为这已经接近我需要的了。
    • $Results += $export 应该反之亦然。 $export += $Results。最好将整个 foreach 分配给 $export 收集所有输出,然后不需要中间 $Results。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2022-08-03
      • 2020-06-05
      • 1970-01-01
      • 2013-07-15
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2016-02-11
      相关资源
      最近更新 更多