如何将代理功能的输出格式化为单独的行?

时间:2015-07-29 13:36:24

标签: powershell powershell-v4.0

我为Get-ADUser创建了一个代理函数,它为输出添加了一些AD属性。我正在尝试格式化它们以便更容易阅读。我希望将这两个附加属性格式化为垂直列表,如下所示:

Name              : Joe Bloggs
DistinguishedName : CN=Joe Blogs,OU=User,etc.
ProxyAddresses    : j.bloggs@blah.com
                    user.admin@blah.com
                    mr.big@blah.com
Member of         : ABCGroup1
                    ABCGroup2
                    ABCGroup3

目前,proxyAddresses的格式为'j.bloggs@blah.com user.admin@blah.com mr.big@blah.commember',memberOf格式为'{ABCGroup1, ABCGroup2, ABCGroup3}'

重新创建。创建一个模块:

New-ModuleManifest 'C:\Users\user-id\Documents\WindowsPowerShell\Modules\TestModule1\TestModule1.psd1' -FormatsToProcess 'TestModule1.format.ps1xml' -ScriptsToProcess 'Get-ADUserEx.ps1'

使用C:\Users\user-id\Documents\WindowsPowerShell\Modules\TestModule1\Get-ADUserEx.ps1(结尾处的代码)和位于C:\Users\user-id\Documents\WindowsPowerShell\Modules\TestModule1\TestModule1.format.ps1xml的格式文件创建Get-ADUser的代理函数,其中包含:

我已将代理功能添加到新模块,该模块还包含一个TestModule1.format.ps1xml文件,其中包含定义为的视图:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
  <SelectionSets>
  </SelectionSets>
  <Controls>
  </Controls>
  <ViewDefinitions>
    <View>
      <Name>ADABCUserList</Name>
      <ViewSelectedBy>
        <TypeName>ABC.ADUserEx</TypeName>
      </ViewSelectedBy>
      <ListControl>
        <ListEntries>
          <ListEntry>
            <ListItems>
              <ListItem>
                <PropertyName>Name</PropertyName>
              </ListItem>
              <ListItem>
                <PropertyName>DistinguishedName</PropertyName>
              </ListItem>
              <ListItem>
                <PropertyName>ProxyAddresses</PropertyName>
                <FormatString>{0}</FormatString>
              </ListItem>
              <ListItem>
                <Label>ABC Group(s):</Label>
                <ScriptBlock>
                    foreach ($item in $_.MemberOf) {
                        if ($item -match 'ABC') {
                            $commaIndex = $item.IndexOf(',OU=')
                            $cn = $item.Substring(3, $commaIndex - 3)
                            "{0}" -f $cn
                        }
                    }
                </ScriptBlock>
              </ListItem>
            </ListItems>
          </ListEntry>
        </ListEntries>
      </ListControl>
    </View>
  </ViewDefinitions>
</Configuration>

功能如下:

function Get-ADUserEx {
    [CmdletBinding(DefaultParameterSetName='Filter')]
    param(
        [Parameter(ParameterSetName='Filter', Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]
        ${Filter},

        [Parameter(ParameterSetName='LdapFilter', Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]
        ${LDAPFilter},

        [Alias('Property')]
        [ValidateNotNullOrEmpty()]
        [string[]]
        ${Properties},

        [Parameter(ParameterSetName='Filter')]
        [Parameter(ParameterSetName='LdapFilter')]
        [ValidateRange(0, 2147483647)]
        [ValidateNotNullOrEmpty()]
        [int]
        ${ResultPageSize},

        [Parameter(ParameterSetName='LdapFilter')]
        [Parameter(ParameterSetName='Filter')]
        [System.Nullable[int]]
        ${ResultSetSize},

        [Parameter(ParameterSetName='LdapFilter')]
        [Parameter(ParameterSetName='Filter')]
        [ValidateNotNull()]
        [string]
        ${SearchBase},

        [Parameter(ParameterSetName='Filter')]
        [Parameter(ParameterSetName='LdapFilter')]
        [ValidateNotNullOrEmpty()]
        [Microsoft.ActiveDirectory.Management.ADSearchScope]
        ${SearchScope},

        [Parameter(ParameterSetName='Identity', Mandatory=$true, Position=0, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        [Microsoft.ActiveDirectory.Management.ADUser]
        ${Identity},

        [Parameter(ParameterSetName='Identity')]
        [ValidateNotNullOrEmpty()]
        [string]
        ${Partition},

        [ValidateNotNullOrEmpty()]
        [string]
        ${Server},

        [ValidateNotNullOrEmpty()]
        [pscredential]
        [System.Management.Automation.CredentialAttribute()]
        ${Credential},

        [Microsoft.ActiveDirectory.Management.ADAuthType]
        ${AuthType})

    begin
    {
        try {
            $outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }

            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-ADUser', [System.Management.Automation.CommandTypes]::Cmdlet)

            $props = @(
                'ProxyAddresses',
                'MemberOf'
            )

            if ($PSBoundParameters.ContainsKey('Properties')) {
                foreach ($prop in $PSBoundParameters['Properties']) {
                    if (-not $props.Contains($prop)) {
                        $props += $prop
                    }
                }
            }

            $PSBoundParameters['Properties'] = $props

            $scriptCmd = { & $wrappedCmd @PSBoundParameters | 
                    ForEach-Object { 
                        $_.PSTypeNames.Insert(0,'ABC.ADUserEx'); 
                        $_ 
                    }
            }

            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($PSCmdlet)
        } catch {
            throw
        }
    }

    process
    {
        try {
            $steppablePipeline.Process($_)
        } catch {
            throw
        }
    }

    end
    {
        try {
            $steppablePipeline.End()
        } catch {
            throw
        }
    }
    <#

    .ForwardHelpTargetName Get-ADUser
    .ForwardHelpCategory Cmdlet

    #>
}

1 个答案:

答案 0 :(得分:1)

您所看到的是Out-Host格式化对象成员的默认行为。每当你看到{}时,它都是因为该成员是一个集合(你可能已经知道了,只是指出了彻底性)。

那说......如果你想要它打印&#34;漂亮&#34;在控制台中,您将不得不连接一个大字符串而不是使用集合。关键是使用&#34;`n&#34;在你的字符串中创建一个新的行返回。

我使用您的XML对此进行了简单测试,但是我认为您需要进行一些调整以确保它正确地分割您的字符串并按您希望的方式格式化。

对于代理地址,我能够逃脱这一点。最糟糕的情况是,如果地址不作为数组返回,您必须使用$ _。split(&#34;&#34;)。

    <ListItem>
        <Label>ProxyAddressesPretty</Label>
        <ScriptBlock>
            $_.ProxyAddresses | %{
                $return += $_ + "`n"
            }
            return $return
        </ScriptBlock>
    </ListItem>

我对MemberOf组采用了类似的方法

    <ScriptBlock>
        $groups = ""
        foreach ($item in $_.MemberOf) {
            $commaIndex = $item.IndexOf(',OU=')
            $cn = $item.Substring(3, $commaIndex - 3)
            $groups += "$cn`n"
        }
        return $groups
    </ScriptBlock>

希望有帮助...