2012-02-21 19 views
1

我有一個腳本,可以掃描我的域中的所有服務器,並將其輸出到兩個單獨的CSV文件 - 一個簡單且廣泛。通過幾個foreach收集信息,然後在腳本結尾處輸出csv

我在我的csv上寫了一行。這導致成千上萬的文件打開和文件關閉..我已經潛伏並理解我應該首先收集所有信息並將其全部寫入在腳本結尾處掃一遍。但我如何做到這一點與export-csv(最好使用函數)?

有沒有一種方法可以使用短和長列表相同的功能?

腳本每個域/服務器上執行許多任務,但我已經修剪下來到這對您的觀賞樂趣:

$domains = "no","se","dk" 

# Loop through specified forests 
foreach ($domain in $domains) { 

    # List all servers 
    $servers = Get-QADComputer 

    # Looping through the servers 
    foreach ($server in $servers) { 

     # GENERATE LONGLIST # 
     # Ping server 
     if (Test-Connection -ComputerName $server.name -count 1 -Quiet) 
     { 
      $Reachable = "Yes" 

      # Fetch IP address 
      $ipaddress = [System.Net.Dns]::GetHostAddresses($Server.name)|select-object IPAddressToString -expandproperty IPAddressToString 

      # Formatting output and export all info to CSV 
      New-Object -TypeName PSObject -Property @{ 
       SystemName = ($server.name).ToLower() 
       Reachable = $Reachable 
       Domain = $server.domain 
       IPAddress = $IPAddress 
       } | Select-Object SystemName,Domain,IPAddress| Export-Csv -Path "longexport.csv" -append  
     } 
     else # Can't reach server 
     { 
      $reachable = "No" 
      $IPAddress = "Unknown" 

      # Formatting output and export all info to CSV 
      New-Object -TypeName PSObject -Property @{ 
       SystemName = ($server.name).ToLower() 
       Reachable = $Reachable 
       Domain = $server.domain 
       } | Select-Object SystemName,Domain,IPAddress| Export-Csv -Path "shortexport.csv" -append 
     } 
    } 
} 

(讓我只想說,我知道,我不能這樣做 - append with export-csv,但我使用的是讓我這樣做的功能..)

回答

3

您正在將相同數量的屬性導出到每個文件,因此我不確定我是否理解爲什麼其中一個屬性被認爲是長和短。無論如何,我建議如下,不要將所有計算機分配給一個變量,它可能會佔用大量RAM,而是使用流式方式(一次一個對象)並使用foreach對象。另外,因爲我發現在每個域操作結束時(每個域一個)輸出到文件的文件沒有區別。而用另一個小辮子,你只能給文件寫一次。

$domains = "no","se","dk" 

foreach ($domain in $domains) { 

    Get-QADComputer -Service $domain -SizeLimit 0 | Foreach-Object { 

     $reachable = Test-Connection -ComputerName $_.Name -count 1 -Quiet 

     if($reachable) 
     { 
      $IPAddress = [System.Net.Dns]::GetHostAddresses($_.Name)|select-object IPAddressToString -expandproperty IPAddressToString 
     } 
     else 
     { 
      $IPAddress = $null 
     } 


     New-Object -TypeName PSObject -Property @{ 
       SystemName = $_.Name.ToLower() 
       Reachable = $reachable 
       Domain = $_.Domain 
       IPAddress = $IPAddress 
     } | Select-Object SystemName,Domain,IPAddress 

    } | Export-Csv -Path export.csv -Append 
} 
+0

謝謝! 「長」ping服務器,「短」不。我忘了從選擇的對象中刪除IPAddress :)有沒有辦法做不同的|從同一個對象中選擇對象? – Sune 2012-02-21 20:22:42

+0

還有一件事..我在$ servers.length變量的幫助下顯示一個狀態欄。我能用這種方法做類似的事嗎? – Sune 2012-02-21 20:44:35

+1

您可以將新對象保存到變量中,並通過管道將其選中並每次選擇不同的屬性。關於$ servers.length,您無法顯示它的長度,因爲您一次只能處理一個名稱。您可以創建一個變量並在每次迭代中增加它並顯示其值。 – 2012-02-21 20:56:10

3

您需要在內存中保留數據以防止打開/關閉多個文件。

您可以通過添加你的數據像這樣的數組做到這一點:

$myData = @() 
$myData += New-Object -TypeName PSObject -Property @{ 
       SystemName = ($server.name).ToLower() 
       Reachable = $Reachable 
       Domain = $server.domain 
       } | Select-Object SystemName,Domain,IPAddress 

然後在處理結束使用$myData | ConvertTo-CSV | Out-File C:\Data.csv或只是$myData | Export-Csv C:\Data.csv陣列轉換成CSV。

+0

謝謝安迪!數組的工作方式與psobject類似嗎?對不起,如果這是一個noob問題,但我有點小菜:) – Sune 2012-02-21 21:07:53

+1

@Sune沒問題,我們都開始某處;-)想想陣列作爲一個桶(在內存中)可以存儲您的PSObjects。 PSObject是一個單獨的對象,其中數組是對象的集合。 '+ ='操作符將您的新PSobject添加到列表中。循環完成後,您將獲得一個完整的PSObjects數組。 – 2012-02-21 21:21:25

+0

這是一個很好的解決方案,但是由於內存問題,我選擇了Shay's。非常感謝你的解釋,但:) :) – Sune 2012-02-22 11:55:22

相關問題