1

ドメイン内のすべてのサーバーをスキャンし、2つの別々のCSVファイルに出力するスクリプトがあります。1つは単純で、もう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で-appendを実行できないことはわかっていますが、これを実行できる関数を使用しています。)

4

2 に答える 2

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次に、処理の最後に、またはを使用して配列をCSVに変換し$myData | Export-Csv C:\Data.csvます。

于 2012-02-21T19:26:57.390 に答える
3

同じ量のプロパティを各ファイルにエクスポートしているので、そのうちの1つが長いと見なされ、もう1つが短いと見なされる理由がわかりません。とにかく、私は次のことをお勧めします。すべてのコンピューターを変数に割り当てないでください。多くのRAMを使用する可能性があります。代わりに、ストリーミング方法(一度に1つのオブジェクト)を使用し、foreach-objectを使用します。また、各ドメイン操作の最後にファイルに出力するファイルに違いがないため(ドメインごとに1つ)。また、別のツイックを使用すると、ファイルに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  
}
于 2012-02-21T19:37:06.810 に答える