2017-07-12 14 views
0

私のforeachループをcsvファイルまたはexcelファイルに出力する方法を教えてください。このスクリプトは、ローカルネットワークからすべてのコンピュータを取得し、そのコンピュータに特定のKBパッチがあるかどうかを確認するためにテストします。スクリプトは、私がcsvファイルに出力しようとするのに役立つと言ったように動作します。任意のヒント/ヘルプは、これはきれいに、私は通常、カスタムオブジェクトを使用するためにはcsvファイルにforeachループを入れる

$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

コードを高く評価しています。

$record = $tmpRecord.psobject.copy() 

プット:レコードのOBJのクローンを作成し、foreachの内部

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

あなたのforeachの前に、空の配列インスタンス化:

$records = @() 

をし、オブジェクトテンプレートを作成しますレコードへのあなたのデータ:

CSVにforeachの後に続いて

$records += $record 

、輸出:

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

配列にレコードを入れ

$records | export-csv yourcsv.csv 

私が最初にこのことを知ったとき、オブジェクトテンプレートの必要性は私に混乱しましたパターン。これは、スコープの組み合わせとオブジェクトの配列への追加(参照による)のために必要です。

ループ内でオブジェクトを宣言するのをやめようとすると、そのオブジェクトはforeachループの有効期間までスコープされます。そのオブジェクトへの参照を$ records配列に追加します。 foreachループが完了すると、存在しないオブジェクトへの参照がいっぱいになる配列が作成されます。

+1

テンプレートは不要ですが、ForEachループの各パスで新しいカスタムオブジェクトを作成するだけで済みます。 '$ records + ='行に変数を '[array] $ records'として強く入力し、事前にインスタンス化することは避けてください。 '+ ='を使うたびに配列がどのように破壊され、再構築されるかによって、 '[array] $ Records = ForEach(){'を実行し、配列を再構築するのではなくループ出力オブジェクトをまとめて収集する方がよい何度も。 – TheMadTechnician

関連する問題