【问题标题】:Output of installed programs with CSV-Export使用 CSV-Export 输出已安装程序
【发布时间】:2017-08-31 00:33:46
【问题描述】:

我当前项目的输出和导出存在几个问题。我正在使用 cmdlet Get-RemoteProgram 通过网络和注册表项获取已安装的软件。

这是我现在的代码:

function Get-RemoteProgram ....

$computername = Import-Csv "C:\data\test\test.csv" |
                select -ExpandProperty PCName
$regex = @("Program1|Program2|Program3")
$items = @()

foreach ($computer in $computername) {
  if (Test-Connection $computer -ErrorAction SilentlyContinue -Count 1) {
    $query = Get-RemoteProgram -ComputerName $computer -Property DisplayVersion |
             where {$_.ProgramName -match $regex}
    $obj = New-Object -Type PSObject
    $obj | Add-Member -Name ("Computername") -Value $computer -MemberType NoteProperty -Force
    $maxcount = $query.ProgramName.Count
    if ($maxcount -gt 1) {
      for ($i=0; $i -lt $maxcount; $i++) {
        $progandversion = $query.ProgramName[$i] + $query.DisplayVersion[$i]
        $obj | Add-Member -Name ($progandversion) -Value "Available" -MemberType NoteProperty -Force
      }
    } elseif ($maxcount -eq 1) {
      $progandversion = $query.ProgramName + $query.DisplayVersion
      $obj | Add-Member -Name ($progandversion) -Value "Available" -MemberType NoteProperty -Force
    }

    $obj | Add-Member -Name ("ProgrammVersion$i") -Value $query.DisplayVersion[$i] -MemberType NoteProperty -Force
    $items += $obj
  }

  $items | Export-Csv c:\daten\inventur\output_final.csv -Append -Force
  Write-Host "$computer has been checked.."
}

我现在遇到的问题是我的脚本没有列出我正在寻找的所有不同的程序。它应该导出计算机名,然后 - 在同一行中 - 如果安装了软件,则输出一个可用的名称,如果未找到该程序,则保持它的清洁。

这就是我现在得到的输出:

#TYPE System.Management.Automation.PSCustomObject 计算机名,“程序 1”,“程序 2” 计算机1,"可用","可用" 计算机1,"可用","可用" 计算机2,, 计算机1,"可用","可用" 电脑3,, 计算机2,, 计算机1,"可用","可用"

我不知道为什么计算机在输出中多次出现。

我想要这样:

计算机名称、程序 1、程序 2、程序 3、程序 4 计算机1,可用,,可用,, 计算机2,可用,,,, 计算机3,,,可用, 计算机4,,,,

你能帮我吗?

【问题讨论】:

    标签: powershell csv export output


    【解决方案1】:

    您的问题有两个方面。首先,您要更新 CSV 中的现有数据,但在运行 Export-CSV 时使用 -Append。这解释了存在多个具有给定ComputerName 的行。其次,您没有为给定的ProgramName 设置默认值,因此输出 CSV 中不存在任何找不到的程序的属性。要解决您的第一个问题,您需要运行 Export-CSV 而不附加以将整个数据集保存到您的 CSV 文件中。为了解决您的第二个问题,您应该使用属性预先填写新的PSObjects。准备工作应该是这样的:

    $programs=get-content "programs.txt" # one name one line, or an array of names in @()
    $regex='('+($programs -join ',')+')' # regex out of array
    

    然后在您的主循环中,您在调用New-Object 后添加此行:

    $programs | % { $obj | Add-Member -Name $_ -Value "Not found" -MemberType NoteProperty } # create default values
    

    应该这样做。如果需要,将“未找到”替换为空字符串。

    【讨论】:

    • 感谢您的快速响应。在我添加了您的答案的第二个引用并在 .txt 中添加了程序之后,现在有这个输出.. 我怎样才能让程序检查 programs.txt 中的程序是否安装在计算机列表中的指定计算机上?
    • 嗯,你已经做得很好了。程序名称可能在某处有不同的拼写,这就是为什么你可能会得到错误的输出。还要检查regex 的格式是否正确。
    【解决方案2】:

    c#中的编码版本通过windows注册表安装程序

    using Microsoft.Win32;
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    
    namespace SoftwareInventory
    {
        class Program
        {
            static void Main(string[] args)
            {
                //!!!!! Must be launched with a domain administrator user!!!!!
                Console.ForegroundColor = ConsoleColor.Green;
                StringBuilder sbOutFile = new StringBuilder();
                Console.WriteLine("DisplayName;IdentifyingNumber");
                sbOutFile.AppendLine("Machine;DisplayName;Version");
    
                //Retrieve machine name from the file :File_In/collectionMachines.txt
                //string[] lines = new string[] { "NameMachine" };
                string[] lines = File.ReadAllLines(@"File_In/collectionMachines.txt");
                foreach (var machine in lines)
                {
                    //Retrieve the list of installed programs for each extrapolated machine name
                    var registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
                    using (Microsoft.Win32.RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machine).OpenSubKey(registry_key))
                    {
                        foreach (string subkey_name in key.GetSubKeyNames())
                        {
                            using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                            {
                                //Console.WriteLine(subkey.GetValue("DisplayName"));
                                //Console.WriteLine(subkey.GetValue("IdentifyingNumber"));
                                if (subkey.GetValue("DisplayName") != null)
                                {
                                    Console.WriteLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version")));
                                    sbOutFile.AppendLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version")));
                                }
                            }
                        }
                    }
                }
                //CSV file creation
                var fileOutName = string.Format(@"File_Out\{0}_{1}.csv", "Software_Inventory", DateTime.Now.ToString("yyyy_MM_dd_HH_mmssfff"));
                using (var file = new System.IO.StreamWriter(fileOutName))
                {
    
                    file.WriteLine(sbOutFile.ToString());
                }
                //Press enter to continue 
                Console.WriteLine("Press enter to continue !");
                Console.ReadLine();
            }
    
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多