通过几个foreach收集信息,然后在脚本结尾处导出-csv

时间:2012-02-21 19:20:44

标签: powershell foreach export-to-csv

我有一个脚本扫描我域中的所有服务器并输出到两个单独的CSV文件 - 一个简单,一个广泛。

我当时写了一行到我的csv ..这导致成千上万的文件打开和文件关闭..我潜伏在周围,并明白我应该首先收集所有信息并将其全部写入一个扫描脚本的末尾。但是如何使用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做 - 但是我正在使用一个让我这样做的功能..)

2 个答案:

答案 0 :(得分: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$myData | Export-Csv C:\Data.csv将数组转换为CSV。

答案 1 :(得分:3)

您正在向每个文件导出相同数量的属性,因此我不确定我是否理解为什么其中一个被视为长而一短。无论如何,我建议如下,不要将所有计算机分配给变量,它可以占用大量RAM,而是使用流式方式(一次一个对象)并使用foreach-object。此外,因为我发现在每个域操作结束时输出到文件的文件没有区别(每个域一个)。而另一个twick你只能写一次文件。

$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  
}