【问题标题】:Powershell - How to remove trailing spaces from a list of groups a user is inPowershell - 如何从用户所在的组列表中删除尾随空格
【发布时间】:2020-09-11 06:29:43
【问题描述】:

我已经复制/创建了一个脚本来获取用户所属组的所有成员,包括嵌套组。但是,我的输出并不是我想要的那样。

它有两种方式之一。要么输出为一个大字符串,看起来不错,但每行都有尾随空格,所以我不能简单地将其复制并粘贴到 AD 中。或者,如果我将 Out-String 更改为使用 -stream,它会显示为乱码,但可能允许我修剪空格。

我目前在一个简单的 GUI 中将输出输入到 TextBox。

Function Get-ADUserNestedGroups {
Param
(
    [string]$DistinguishedName,
    [array]$Groups = @()
)

#Get the AD object, and get group membership.
$ADObject = Get-ADObject -Filter "DistinguishedName -eq '$DistinguishedName'" -Properties memberOf, DistinguishedName;

#If object exists.
If($ADObject)
{
    #Enummurate through each of the groups.
    Foreach($GroupDistinguishedName in $ADObject.memberOf)
    {
        #Get member of groups from the enummerated group.
        $CurrentGroup = Get-ADObject -Filter "DistinguishedName -eq '$GroupDistinguishedName'" -Properties memberOf, DistinguishedName;
   
        #Check if the group is already in the array.
        If(($Groups | Where-Object {$_.DistinguishedName -eq $GroupDistinguishedName}).Count -eq 0)
        {
            #Add group to array.
            $Groups +=  $CurrentGroup;

            #Get recursive groups.      
            $Groups = Get-ADUserNestedGroups -DistinguishedName $GroupDistinguishedName -Groups $Groups;
        }
    }
}

#Return groups.
Return $Groups;
}

 Function Display-UserGroups {

#Get all groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName (Get-ADUser -Identity $userSAM).DistinguishedName;

$ResultsTextBox.Text = $Groups | Select-Object Name| Sort-Object name | Out-String

第一种方式的输出如下:

组名1(这里八个空格)

组名2(这里八个空格)

第二种方式的输出如下:

组名1组名2组名3

感谢您的帮助!

【问题讨论】:

  • 看起来你做的比这里发布的输出尝试更多。您可以修剪字符串,然后为文本框添加换行符:($Groups | Select -Expand Name | Sort).Trim() -join "`n"
  • 这成功了!我确实必须使用反引号“r”和n。谢谢@AdminOfThings

标签: powershell


【解决方案1】:

您需要修剪输出,这可以使用String.Trim 方法轻松完成。但是,它只能应用于字符串。 $Groups 将是 ADObject 类型的数组。您需要返回这些对象的 Name 值并将 Trim() 方法应用于这些值。

($Groups | Select -Expand Name | Sort).Trim() -join "`r`n"

【讨论】:

  • 额外的空格可能来自Select-Object 生成的单个属性(名称)对象的默认表输出。 -ExapandProperty 参数正在改变这种行为,创建一个扁平的字符串数组。这类似于my answer,只是我从$Groups 变量中展开了Name 属性。我认为.Trim() 是不必要的! name 属性本身不太可能有尾随空格。我认为 AD 甚至不允许名称的尾随空格。
  • @Steven 这是可能的。我知道查询 AD 对象,就个人而言,从来没有给我这个问题。在原始帖子中执行了许多不必要的代码,并且某些东西正在正常处理,干净的对象。我只添加了这个答案,因为发帖人说我的评论解决了这个问题。
  • 我没有批评。有点想知道我们是否应该超越问题的范围进行改进?我同意你的看法,我在自己的回答中制作了模组。我确定填充问题,虽然它是模糊的但已知的。并且,MS Doc 确认不允许前导/尾随空格。抱歉,我只是认为需要澄清一下。感谢您的理解。
【解决方案2】:

您可以使用$Groups += $CurrentGroup.trimEnd() 添加删除尾随空格的值。

您可能想要研究的其他一些方法

.trim()      # Trim leading and trailing
.trimEnd()   # Trim trailing
.trimStart() # Trim leading

【讨论】:

  • TrimEnd() 属于 String 类。返回的对象是 ADObject 类型。我认为这个想法很好,但必须先进行转换。
【解决方案3】:

填充是由 PowerShell 的格式化系统引起的。 Select-Object 正在返回单个属性(名称)对象。 PowerShell 将其输出为表格,其中可能有一些填充。 Out-String 保留该填充,这就是它反映在您的最终输出中的原因...

组的名称属性已经是一个字符串。如果您从 $Groups 变量/集合展开 Name 属性,则无需使用 Out-String

对可读性和测试进行了一些其他调整。下面将发出一个字符串,每个组在一个新行上。那应该可以粘贴到 AD 中,我认为您的意思是 Active Directory 用户和计算机。

Function Get-ADUserNestedGroups
{
    Param
    (
        [string]$DistinguishedName,
        [array]$Groups = @()
    )
    
    # Get the AD object, and get group membership.
    $ADObject = Get-ADObject $DistinguishedName -Properties memberOf, DistinguishedName
    
    # If object exists.
    If( $ADObject )
    {
        # Enummurate through each of the groups.
        Foreach( $GroupDistinguishedName in $ADObject.memberOf )
        {
            # Get member of groups from the enummerated group.
            $CurrentGroup = Get-ADObject $GroupDistinguishedName -Properties memberOf, DistinguishedName
       
            # Check if the group is already in the array.
            If( $Groups.DistinguishedName -notcontains $GroupDistinguishedName )
            {
                # Add group to array.
                $Groups +=  $CurrentGroup
    
                # Get recursive groups.      
                $Groups = Get-ADUserNestedGroups -DistinguishedName $GroupDistinguishedName -Groups $Groups
            }
        }
    }
    
    # Return groups.
    Return $Groups
    }
    
$userSAM = 'UserName'

# Get all groups.
$Groups = Get-ADUserNestedGroups -DistinguishedName (Get-ADUser -Identity $userSAM).DistinguishedName
($Groups.Name | Sort-Object) -join [System.Environment]::NewLine

在您会看到的次要更改中,我在几个地方删除了-Filter 参数。 DistinguishedName 可以用作-Identity 参数,因此无需过滤。

此外,在您检查 $Groups 集合是否已经有当前组的地方,我使用了 -notContains 运算符。这应该比使用|Where{...} 重复迭代集合更快。代码也更短且更具可读性。

注意:如果我们反转操作数,我们可以使用-notin,这可能看起来 还是更好

旁白;您应该避免使用+= 附加数组。这样做可能会导致性能问题,因为它会创建一个新数组,任何内容都会复制过来。处理这个问题的最好方法是让 PowerShell 为你积累结果。如果您必须直接进行追加,请考虑使用数组列表。这方面的资料很多,google一下就行了。

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 2021-09-13
    • 2018-11-30
    • 2012-01-03
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多