Соберите информацию через несколько foreach и затем экспортируйте CSV в конце скрипта - PullRequest
1 голос
/ 21 февраля 2012

У меня есть скрипт, который сканирует все мои серверы в моих доменах и выводит в два отдельных файла 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
        }
    }
}

(и позвольте мне сказать, что я знаю, что не могу сделать -append с export-csv, но я использую функцию, которая позволяет мне делать это ..)

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Вы экспортируете одинаковое количество свойств в каждый файл, поэтому я не уверен, что понимаю, почему одно из них считается длинным, а другое коротким. В любом случае, я предлагаю следующее: не назначайте всем компьютерам переменную, это может занимать много ОЗУ, вместо этого используйте потоковый способ (по одному объекту за раз) и используйте foreach-объект. Кроме того, поскольку я не нахожу различий в файлах, я выводлю их в файл в конце каждой операции с доменом (по одному на домен). И с другим твиком вы можете записать в файл только один раз.

$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  
}
3 голосов
/ 21 февраля 2012

Вам нужно будет хранить данные в памяти, чтобы предотвратить открытие / закрытие нескольких файлов.

Вы можете сделать это, добавив ваши данные в массив следующим образом:

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

...