2015-02-09 2 views
0

Я относительно не знаком с сценариями PowerShell и в основном собирал разные скрипты и командлеты из Google, что я пытаюсь сделать. Одна из проблем, которые я не могу выполнить Google, или поиск на StackExchange, из-за специальных символов, имеет все мои результаты, полученные как @ {ColumnName = ColumnData}.Удалить @ {ColumnName из результатов Powershell

Вот пример сценария, который я нашел где-то, чтобы вытащить всех членов группы AD.

$Groups = Get-ADGroup -Filter {Name -like "!GroupName"} 
$path = $groups 
$myCol = @() 
ForEach ($Group in $Groups) 
{ 
    $Members = @(Get-ADGroupMember "$Group") 
    ForEach ($Member in $Members){ 
     try{ 
     $user = get-aduser -identity $member -properties displayname 
     $MyObject = New-Object PSObject -Property @{ 
     Displayname = $user.Displayname 
     }   
     $mycol += $MyObject} 
catch {}} 
    } 
Write-Host $MyCol | FL 

Я довольно уверен, что есть более эффективные способы, чтобы получить член группы в AD, но это не проблема на данный момент. Проблема заключается в том, что все данные выходят, как @ {Displayname = Lawrence, Kimberly}, и это происходит со многими сценариями, которые я выбрасывал вместе.

Любые идеи о том, как правильно писать сценарии, чтобы я мог просто получить DisplayName = Lawrence, Kimberly?

ответ

0

Согласен ваш код является сложным, и это не обязательно. Несколько вещей, которые необходимо упомянуть, это , почему ваш выход выглядит так, как он.

Вы создаете массив из PSCustomObject s, который похож на хеш-таблицы. В конце вашей обработки у вас есть массив объектов со свойством DisplayName. Поскольку вы используете Write-Host, чтобы отобразить содержимое $myCol, для его отображения необходимо указать строковый массив. Вы увидите аналогичный результат, если бы вы набрали только [string[]]$myCol. Я должен надеяться, что вы делаете что-то еще в обработке, как и другие ответы, показывают, что у вас очень сложный способ получить то, что вы ищете.

Без избиения лошади о тех других решениях Я предложу некоторые незначительные изменения в вашем, как он стоит. Ваше название и последнее предложение противоречат тому, что вы ищете, так как вы хотите удалить ColumnName в заголовке и последнем предложении, которое вы ищете, например, DisplayName = Name.

Изменение последней строки приведет к обоим из них. Если вы просто хотите displayname сек там собственный

$myCols | Select-Object -ExpandProperty DisplayName 

Lawrence, Kimberly 

и если вы на самом деле хотите другой формат, который вы могли бы сделать это

$myCols | ForEach-Object{ 
    "DisplayName = $($_.DisplayName)" 
} 

Опять же, как и другие ответы, я хотел бы подчеркнуть, что ваш код может использовать простой капитальный ремонт.Если вам нужно понять, почему он работает так, я надеюсь, что помог немного.

+0

Благодарим вас за разъяснение PSCustomObjects и хэш-таблиц. Поскольку я столкнулся с этой проблемой с различными сценариями, ваш ответ - это информация, которую я ищу больше, чем решение этого конкретного кода. Речь идет только об использовании write-host, который мешает им отображать то, что я хочу, или мне нужно сохранить данные по-другому, прежде чем отображать его? – user2516896

+0

@ user2516896 'Write-Host' отлично подходит для основной строки и раскраски. Если у вас есть объект и вы хотите, чтобы информация _display_ отображалась на экране, может помочь помощь в командлетах 'Format-'. '$ MyCol | FL' самостоятельно может работать. Вне этого это сводится к потребностям и предпочтениям. Один размер не подходит для всех. – Matt

0

Это фактически не имеет никакого отношения к Active Directory; Вы создаете пользовательские объекты, а затем выводите их напрямую, и по умолчанию именно так PowerShell будет форматировать вывод, если вы используете Write-Host (который предназначен для настройки вывода). Если вы хотели бы быть более конкретным о том, что результат должен выглядеть, мы можем помочь, но вот пример, который выводит результаты как только список строк, только с помощью Write-Output:

$myCol = @() 
$MyObject = New-Object PSObject -Property @{ DisplayName = "Lawrence, Kimberly" } 
$myCol += $MyObject 
$MyObject = New-Object PSObject -Property @{ DisplayName = "Hello, World" } 
$myCol += $MyObject 

# The default will show at-symbols, etc: Write-Host $MyCol | FL 

Write-Output $myCol 

выход будет:

DisplayName                                       
-----------                                       
Lawrence, Kimberly                                      
Hello, World  
0

Попробуйте это:

Get-ADGroup -Filter "Name -like '!GroupName'" | 
    Get-ADGroupMember | 
    Get-ADUser -Properties DisplayName | 
    Select-Object DisplayName 

Когда я запустил свой код, я также получил хэши, даже без специальных символов. Ваш код слишком излишне сложный.

Смежные вопросы