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



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

我一次只在csv中写一行。。这导致数千个文件打开和关闭。。我一直潜伏在周围,明白我应该首先收集所有信息,并在剧本结束时一气呵成。但是我该如何使用导出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,但我使用的是一个让我来做这件事的函数。)

您将相同数量的属性导出到每个文件,所以我不确定为什么其中一个属性被认为是长的,另一个属性是短的。无论如何,我建议如下,不要将所有计算机都分配给一个变量,它可能会占用大量RAM,而是使用流方式(一次一个对象)并使用foreach对象。此外,由于我在每个域操作结束时(每个域一个)输出到文件的文件中没有发现任何差异。而对于另一个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  
}

您需要将数据保存在内存中,以防止打开/关闭多个文件。

您可以通过将数据添加到这样的数组中来做到这一点:

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

相关内容

最新更新