Мой цикл Powershell перезаписывает предыдущую запись Excel. Использование Export-CSV -append дублирует записи

Powershell определенно не входит в число моих «сильных сторон», но время от времени я пытаюсь написать что-нибудь, чтобы автоматизировать ручную задачу. Во всяком случае, вот моя проблема. Сценарий в том виде, в каком он есть, РАБОТАЕТ и БУДЕТ экспортировать CSV-файл и сортировать его по заголовку Hostname. Мои проблемы в том, что должен быть лучший способ сделать это?

#Clear the output screen
cls

#set the working directory to where the script and text files are located (must be same directory)
$scriptdir = Split-Path -Parent $PSCommandPath
cd $scriptdir

#set fileNamePaths for Export-Csv No Sort and Sorted to excel
$FilePathNS = "D:\PowerShell_Scripts\HP_Inventory\OAInfoAll_NoSort.csv"
$FilePathSort = "D:\PowerShell_Scripts\HP_Inventory\OAInfoAll.csv"

#set up the ip subnet import
$path = ".\EnclosureSubnets.txt"
$ip = Get-Content $path

#Loop to find OA information
foreach ($subnet in $ip) {

    $OAS = Find-HPOA $subnet -Timeout 250 -Verbose
    $OAS | where {$_.Role -eq "Active"} | Export-Csv -NoTypeInformation -Append $FilePathNS
}

#Sort AOInfoAll.csv by hostname
Import-Csv $FilePathNS | Sort-Object Hostname | Export-Csv $FilePathSort -NoTypeInformation

Если я уберу добавление, цикл перезапишет предыдущую запись, и я получу только 2 IP-адреса и 2 имени хоста. Append исправляет это, НО когда я снова запускаю скрипт, я получаю дублирующиеся/повторяющиеся записи.

Кроме того, я пытался использовать имя хоста Sort-Object внутри цикла, но он сортирует только каждую отдельную запись по мере ее написания. Вот пример (IP-адреса и имена хостов составлены):

IP                  Hostname
192.168.1.10        chassis03
192.168.1.12        chassis05
192.168.2.16        chassis01
192.168.2.18        chassis02
192.168.3.14        chassis07
192.168.3.16        chassis08

Так что, пока мой сценарий работает, я хотел бы услышать отзыв от "Профи". Заранее спасибо!


person user2635584    schedule 19.01.2016    source источник


Ответы (1)


Не экспортируйте внутри своего цикла, вместо этого захватите все захватите все OAS в переменной и отсортируйте ее перед выводом в CSV.

foreach ($subnet in $ip) {

    [array]$OAS += Find-HPOA $subnet -Timeout 250 -Verbose

}

$OAS | Where{$_.Role -eq 'Active'} | Sort Hostname | Export-Csv $FilePathSort -NoTypeInformation

Это значительно снижает количество операций чтения/записи на диск.

person TheMadTechnician    schedule 19.01.2016