2017-07-12 70 views
0

即時通訊卡停留在如何將我的foreach循環輸出到csv或excel文件。此腳本只是將所有計算機關閉到本地網絡,然後測試以查看該計算機是否具有某個KBPatch。該腳本正如我所說的那樣工作,我需要幫助才能將其輸出到csv文件。任何提示/幫助表示讚賞將foreach循環放入csv文件

下面的代碼

$strCategory = "computer" 
$objDomain = New-Object System.DirectoryServices.DirectoryEntry 
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher 
$ObjSearcher.SearchRoot = $objDomain 
$objSearcher.filter = ("(objectCategory=$strCategory)") 
$colProplist = "name" 

foreach($i in $colProplist) 
{ 
    $objSearcher.PropertiesToLoad.Add($i) 
} 


#Finds all operating systems and computer names 
$colResults = $objSearcher.FindAll() 

foreach($objResult in $colResults) 
{  
    $objComputer = $objResult.Properties; 
    $names = $objComputer.name 

# Define Hotfix to check 
    $CheckKBS = @(「patch#" , "patch#") 

#Query the computers for the HotFix 
foreach($name in $names) 
{ 
foreach ($CheckKB in $CheckKBS) { 
$HotFixQuery = Get-HotFix -ComputerName $name | Where-Object {$_.HotFixId -eq $CheckKB} | Select-Object -First 1; 
if($HotFixQuery -eq $null) 
{ 
    Write-Host 「Hotfix $CheckKB is not installed on $name」; 
} 
else 
{ 
    Write-Host 「Hotfix $CheckKB was installed on $name by 」 $($HotFixQuery.InstalledBy); 
} 
}} 
} 

回答

0

要做到這一點乾淨我通常使用的自定義對象。

您的foreach之前,實例化一個空數組:

$records = @() 

,使對象模板:

$tmpRecord = [PSCustomObject]@{ 
    serverName = '' 
    missingKB = '' 
} 

在foreach內部,克隆記錄OBJ:

$record = $tmpRecord.psobject.copy() 

放您的數據錄入記錄:

$record.serverName = $name 
$record.missingKB = $CheckKb 

把記錄到數組:

$records += $record 

在foreach後然後,導出到CSV:

$records | export-csv yourcsv.csv 

需要一個對象模板是混亂的我,當我第一次聽說這個模式。你需要這個,因爲範圍的組合和如何將對象添加到數組(通過引用)。

如果您試圖擺脫在循環內聲明對象,那麼該對象的作用域將被限制在foreach循環的生命週期中。然後,您將該對象的引用添加到$ records數組中。 foreach循環完成後,您將有一個數組充滿對不存在的對象的引用。

+1

不需要模板,您可以在ForEach循環的每次傳遞中構建一個新的自定義對象。你可以在你的'$ records + ='行強行輸入'[array] $ records'作爲變量,並避免事先實例化它。由於數組是如何在每次使用'+ ='的時候被銷燬和重建的,最好''array'$ Records = ForEach(){'並且一次性收集循環輸出對象而不是重建數組一遍又一遍。 – TheMadTechnician