いくつかのforeachを通して情報を収集し、スクリプトの最後にCSVをエクスポートします

StackOverflow https://stackoverflow.com/questions/9383762

質問

ドメイン内のすべてのサーバーをスキャンし、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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top