1

我有一个脚本可以扫描我域中的所有服务器并输出到两个单独的 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 做 -append,但我正在使用一个让我这样做的函数..)

4

2 回答 2

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  
}
于 2012-02-21T19:37:06.810 回答
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 回答