#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]
того, что расставляло объекты по порядку