2014-04-21 25 views
-1

我想弄清楚如何糾正我寫的腳本。我知道它導入主機名列表的方式有問題。我不知道如何解決它。第1部分:這應該導入一個帶有主機名的.csv文件,併爲應用程序的卸載信息挖掘註冊表,並將其放入數組中,然後導出到.csv中供以後使用。此外,它還會創建.txt文件,以便稍後將系統上的應用程序與基準進行比較。Powershell。需要幫助從.csv導入主機名。這工作的其餘部分

$path = "\\path" 
$computers = Import-Csv -Path "\\Path\hostnames.csv" 
$array = @() 
foreach($pc in $computers) 
    { 
    $computername = $pc.computername 
    #$computername = "KNOWN_HOSTNAME" #test line for one system 
    $UninstallKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" 
    $reg = [microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername) 
    $regkey = $reg.OpenSubKey($UninstallKey) 
    $subkeys = $regkey.GetSubKeyNames() 
    foreach($key in $subkeys) 
     { 
     $thisKey=$UninstallKey+"\\"+$key 
     $thisSubKey=$reg.OpenSubKey($thisKey) 
     $obj = New-Object PSObject 
     $obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computername 
     $obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value $($thisSubKey.GetValue("DisplayName")) 
     $obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value $($thisSubKey.GetValue("DisplayVersion")) 
     $obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value $($thisSubKey.GetValue("Publisher")) 
     $obj | Add-Member -MemberType NoteProperty -Name "InstallDate" -Value $($thisSubKey.GetValue("InstallDate")) 
     $array += $obj 
     $ExportArray = $array | Where-Object { $_.DisplayName } | 
      select ComputerName , DisplayName, DisplayVersion, Publisher, InstallDate 
     $ExportArray | 
      Export-csv $path\$computername.csv -NoTypeInformation 
     $ExportArray2 = $array | 
      Where-Object { $_.DisplayName } | 
      select DisplayName, DisplayVersion, Publisher 
     $ExportArray2 | 
      Export-csv $path\$computername.txt -NoTypeInformation 
     } 
    } 

第2部分:該部分編譯的.csv的到一個excel文件報告

$csvs = Get-ChildItem $path\* -Include *.csv 
$outputfilename = "Network_" + (Get-Date -Format yyyyMMdd) 
$excelapp = new-object -comobject Excel.Application 
$excelapp.sheetsInNewWorkbook = $csvs.Count 
$xlsx = $excelapp.Workbooks.Add() 
$sheet=1 
foreach ($csv in $csvs) 
    { 
    $row=1 
    $column=1 
    $worksheet = $xlsx.Worksheets.Item($sheet) 
    $worksheet.Name = $csv.Name 
    $file = (Get-Content $csv.PSPath | ForEach-Object {$_ -replace '"', ""}) 
    foreach($line in $file) 
     { 
     $linecontents = $line -split ‘,(?!\s*\w+」)’ 
     foreach($cell in $linecontents) 
      { 
      $worksheet.Cells.Item($row,$column) = $cell 
      $column++ 
      } 
     $column = 1 
     $row++ 
     } 
    $sheet++ 
    } 
$output = $path + 「\」 + $outputfilename + ".xlsx" 
$xlsx.SaveAs($output) 
$excelapp.quit() 

第3部分:該部分加載了基線,和中的.txt的珍貴創建的,以及用於不同的檢查在文件中。 (也刪除空白輸出中的文件)

$bline = Get-ChildItem $path\* -Include Baseline.txt 
$txts = Get-ChildItem $path\* -Include *.txt -Exclude Baseline.txt 
foreach ($txt in $txts) 
    { 
    Compare-Object -referenceobject $(Get-Content $bline) -differenceobject $(Get-Content $txt) | 
    ft inputobject, @{n = "file"; e = {if ($_.SideIndicator -eq '=>') {"System"} else {"Baseline"}}} | 
    Out-File $txt'_has_diff'.csv -Width 256 
    Get-ChildItem $path | 
     where {$_.Length -eq 0} | 
     Remove-Item 
    } 

謝謝

編輯: 的Hostnames.csv文件,我已經試過有:

HOSTNAME1 
HOSTNAME2 

"HOSTNAME1","HOSTNAME2" 
+0

你能否解釋一下什麼是不工作? – JNK

+0

第2行中的Import-Csv無法正常工作。 我知道這是因爲它試圖命名文件「@ {HOSTNAME1 = HOSTNAME2} .csv」而不是「HOSTNAME1.csv」 ,並且如果您刪除第7行上的#或僅使用一個主機名,則這一切作品 – user3557458

+0

我想我很困惑如何導入不工作 - 你正在使用一個明確的路徑名。你是說導入的數組不正確? – JNK

回答

1

這個問題有點不清楚,因爲你ay「導入主機名列表的方式有些問題」,但是您沒有指定獲得的結果類型,以及它們與預期結果的不同之處。

但是,根據您的示例數據,我認爲我可以推斷出問題所在:您試圖對非CSV數據使用Import-Csv。您的任何示例都不像CSV文件。他們都看起來像列表。在該項目以逗號分隔的列表,如

「主機名1」, 「主機名2」, 「HOSTNAME3」, 「HOSTNAME4」

不叫 「CSV文件」。 CSV文件是"flat file"的一種形式,其中數據表示單個數據庫表的行和列。一個CSV文件的例子應該是這樣的,其中第一行是一個字段(列)名稱列表,其他行是記錄(行),逗號分隔值對應於標題行中的列:

「主機名」, 「操作系統」, 「操作系統版本」, 「主功能」, 「位置」
「BOSEXCH01」, 「窗口」, 「服務器2012」 的 「Microsoft Exchange」, 「波士頓」
「BOSDC01」,「Windows」,「Server 2008 R2」,「Active Directory域控制器」,「波士頓」
「MYWEB」,「Linux」,「Ubuntu 13.04」,「Apache web服務器」

該cmdlet 導入-CSV進口CSV文件導入對象,其中屬性是標題行中的字段名稱和值的陣列是每行中對應於所述屬性名稱的逗號分隔的項目派生自標題行。導出-CSV做相反的—它創建從對象數組CSV文件。

它看起來就像你正在試圖做的是閱讀的主機名的簡單列表到字符串數組。如果您的數據看起來像第一個例子,

主機名1
主機名2 [等等]

,你可以簡單地使用獲取內容讀入到一個數組,如下(請注意,我改變了擴展.TXT,以反映實際的數據格式):

$computers = Get-Content "\\Path\hostnames.txt" 

如果您的數據看起來像第二個例子,

「主機名1」, 「主機名2」,[等等]

你可以讀入數組是這樣的:

$computers = (Get-Content "\\Path\hostnames.txt") -split ',' 

另一方面,看來你使用Export-Csv正確:您正在導出一組具有相同屬性的對象到一個平面文件,這是相同的直接使用術語「CSV」。