Расширение системы.Object[] для экспорта в CSV

#powershell

#powershell

Вопрос:

Еще раз здравствуйте и извините!

Чтобы сделать его действительно коротким. Что я делаю не так? Я пытаюсь экспортировать список пользователей, отфильтрованных с помощью customobject, в CSV, и он выводит его в тот же блок. Нет ли способа изменить это? Я спрашиваю только потому, что на всех других страницах, которые я просматривал, он продолжает указывать мне использовать -join , чтобы объединить их в виде строк, что делает то же самое. Разве невозможно вывести его в виде нескольких строк для каждого пользователя?

 $GPMem = Get-ADGroupMember -Identity security.group | Select-Object -ExpandProperty Name 
[array]$TPpl = $GPMem | Where-Object {$_ -like "T*"} 
[array]$RPpl = $GPMem | Where-Object {$_ -like "r*"} 
[array]$CPpl = $GPMem | Where-Object {$_ -like "c*"} 

[pscustomobject]@{

    TPeople = (@($TPpl) |Out-String).Trim() 
    TPCount = $TPpl.Count
    RPeople = (@($RPpl) |Out-String).ToString()
    RPCount = $TPpl.Count
    CPeople = $CPpl
    CPCount = $TPpl.Count


    } | Export-Csv -Path C:UsersabrahamDesktopcsv.csv -NoTypeInformation -Force
 

введите описание изображения здесь

Комментарии:

1. обычно я использую -join ';' для объединения значений точки с запятой.

2. @Ли, правильно. Он делает то же самое в отношении вывода значения в том же поле. Разве невозможно вывести его в новую строку / поле?

3. если вам нужен многострочный вывод ТОЛЬКО для этого столбца, попробуйте использовать cr/lf разделитель вместо двоеточия. это создаст нестандартный файл CSV, но я полагаю, что в данном случае это приемлемо.

4. @Lee, не хочешь объяснить подробнее? я не знаком с этим, но я хотел бы сделать это для каждого системного объекта.

5. пожалуйста, ознакомьтесь с моим ответом о том, как использовать -join , и новой строкой, чтобы получить многострочный столбец CSV.

Ответ №1:

вот как вставить ; ИЛИ новую строку в значения столбца… [усмешка]

 $ThingList = @('One Thing', 'Two Thing', 'Three Thing')

$ThingList -join '; '
'=' * 20
$ThingList -join [System.Environment]::NewLine
 

вывод …

 One Thing; Two Thing; Three Thing
====================
One Thing
Two Thing
Three Thing
 

Комментарии:

1. Я запускаю PS 5.0 и попробовал, и он не создал новую строку в csv

2. @AbrahamZinala — существуют и другие способы представления новой строки. попробуйте экранированный powershell n r или оба вместе взятых. я не могу показать их как таковые, поскольку escape-символ в PoSh является обратным… [ усмешка ]

3. Я думаю, что замена environment.newline на n выполнит эту работу

4. @AsadBlum — символ `» НЕ является экранирующим символом в обычном PoSh. обратная метка, тем не менее, ЯВЛЯЕТСЯ экранирующим символом для этого типа варианта использования. [ усмешка ]

Ответ №2:

создайте еще 3 массива для подсчета (каждый массив будет экспортирован в столбец), затем найдите массив с наибольшим количеством и сгенерируйте psobject для каждой строки.

 [array]$TPpl = @("T1" ,"T2", "T3")
[array]$TPpl_count = @($TPpl.Count)
[array]$RPpl = @("R1" ,"R2", "R3", "R4")
[array]$RPpl_count = @($RPpl.Count)
[array]$CPpl = @("C1" ,"C2", "C3", "C4","C5")
[array]$CPpl_count = @($CPpl.Count)


$leng = [array]$TPpl.Count,$RPpl.Count,$CPpl.Count
$max = ($leng | measure -Maximum).Maximum

$csv = for($i=0;$i -lt $max;$i  ){

    New-Object -TypeName psobject -Property @{
    "TPeople" = $(if ($TPpl[$i]) { $TPpl[$i]})
    "TPCount" = $(if ($TPpl_count[$i]) { $TPpl_count[$i]})
    "RPeople" = $(if ($RPpl[$i]) { $RPpl[$i]})
    "RPCount" = $(if ($RPpl_count[$i]) { $RPpl_count[$i]})
    "CPeople" = $(if ($CPpl[$i]) { $CPpl[$i]})
    "CPCount" = $(if ($CPpl_count[$i]) { $CPpl_count[$i]})
    }
}

$csv | Export-Csv C:Temptest.csv -NoTypeInformation
 

Результат:

введите описание изображения здесь

ваш окончательный код должен быть:

 $GPMem = Get-ADGroupMember -Identity security.group | Select-Object -ExpandProperty Name 
[array]$TPpl = $GPMem | Where-Object {$_ -like "T*"} 
[array]$RPpl = $GPMem | Where-Object {$_ -like "r*"} 
[array]$CPpl = $GPMem | Where-Object {$_ -like "c*"}
[array]$TPpl_count = @($TPpl.Count)
[array]$RPpl_count = @($RPpl.Count)
[array]$CPpl_count = @($CPpl.Count)


$leng = [array]$TPpl.Count,$RPpl.Count,$CPpl.Count
$max = ($leng | measure -Maximum).Maximum

$csv = for($i=0;$i -lt $max;$i  ){

    New-Object -TypeName psobject -Property @{
    "TPeople" = $(if ($TPpl[$i]) { $TPpl[$i]})
    "TPCount" = $(if ($TPpl_count[$i]) { $TPpl_count[$i]})
    "RPeople" = $(if ($RPpl[$i]) { $RPpl[$i]})
    "RPCount" = $(if ($RPpl_count[$i]) { $RPpl_count[$i]})
    "CPeople" = $(if ($CPpl[$i]) { $CPpl[$i]})
    "CPCount" = $(if ($CPpl_count[$i]) { $CPpl_count[$i]})
    }
}

$csv | Export-Csv C:Temptest.csv -NoTypeInformation
 

Комментарии:

1. Я бы никогда, и я имею в виду, никогда бы до этого не додумался. Я просто устал от того, почему это должно быть так сложно сделать, и я не буду вам лгать. Я немного растерялся, глядя на код, но он работает. Теперь я пытаюсь разбить это по строкам, пытаясь понять, что это наше. Спасибо.

2. и я придерживался [pscustomobject] того, что расставляло объекты по порядку