2017-04-05 48 views
3

我的當前項目的輸出和導出有幾個問題。我正在使用cmdlet Get-RemoteProgram通過網絡和註冊表項獲取安裝的軟件。用CSV導出已安裝程序的輸出

這是我的代碼現在:

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 
Computername,"Program1","Program2" 
Computer1,"Available","Available" 
Computer1,"Available","Available" 
Computer2,, 
Computer1,"Available","Available" 
Computer3,, 
Computer2,, 
Computer1,"Available","Available" 

我不知道爲什麼計算機在輸出多次。

我想有這樣的:

 
Computername,Program1,Program2,Program3,Program4 
Computer1,Available,,Available,, 
Computer2,Available,,,, 
Computer3,,,Available, 
Computer4,,,, 

你能幫我不知何故?

回答

2

你的問題是雙重的。首先,您想要以CSV格式更新現有數據,但在運行Export-CSV時使用-Append。這解釋了存在給定ComputerName的多行。其次,您沒有爲給定的ProgramName設置默認值,因此輸出CSV中不存在任何地方找不到的程序的屬性。要解決您的第一個問題,您需要運行Export-CSV而不用追加將您的整個數據集保存到CSV文件中。爲了解決你的第二個問題,你應該預先填寫新的PSObject的屬性。準備應該做的是這樣的:

$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 

應該做的。如果您願意,可以換一個空字符串「找不到」。

+0

由於在C#中安裝的程序的編碼版本。 在添加了答案的第二個引號並在.txt中添加了程序之後,現在有這個輸出.. 如何讓程序檢查程序是否已安裝或未安裝在指定的計算機上在計算機列表中? – Robin

+0

那麼,你已經很好。有可能程序名稱在某個地方有不同的拼寫,這就是爲什麼你可能會得到錯誤的輸出。同時檢查'regex'是否正確形成。 – Vesper

0

通過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(); 
     } 


    } 
}