いくつかのforeachを通して情報を収集し、スクリプトの最後にCSVをエクスポートします
-
28-10-2019 - |
質問
ドメイン内のすべてのサーバーをスキャンし、2つの個別のCSVファイルに出力するスクリプトがあります。1つはシンプルで1つは広範です。
私はその時点でCSVに1行を書きます。これにより、数千のファイルオープンとファイルクローズが発生します。スクリプトの終わり。しかし、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
}
}
}
(そして、私は私ができないことを知っていると言ってみましょう - export -csvに貼り付けますが、私はこれを行うことができる関数を使用しています。)
解決
あなたは各ファイルに同じ量のプロパティをエクスポートしているので、それらのいずれかがなぜ長くて短いと見なされるのか理解できません。とにかく、私は次のことを提案します。すべてのコンピューターを変数に割り当てないでください、それは多くのRAMを占有することができ、代わりにストリーミング方法(1つのオブジェクト)を使用して、foreach-Objectを使用します。また、ファイルに違いがないため、各ドメイン操作の最後にファイルに出力します(ドメインごとに1つ)。そして、別のツイックでは、ファイルに一度だけ書くことができます。
$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
}
他のヒント
複数のファイルが開いている/閉じるのを防ぐために、データをメモリに保つ必要があります。
このような配列にデータを追加することで、これを行うことができます。
$myData = @()
$myData += New-Object -TypeName PSObject -Property @{
SystemName = ($server.name).ToLower()
Reachable = $Reachable
Domain = $server.domain
} | Select-Object SystemName,Domain,IPAddress
次に、処理の終了時に配列をCSVに変換します $myData | ConvertTo-CSV | Out-File C:\Data.csv
あるいは単に $myData | Export-Csv C:\Data.csv
.