繁体   English   中英

Powershell - 如何从用户所在的组列表中删除尾随空格

[英]Powershell - How to remove trailing spaces from a list of groups a user is in

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

它以两种方式之一进行。 要么输出为一个看起来不错的大字符串,但每行都有尾随空格,因此我不能简单地将其复制并粘贴到 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

谢谢你的帮助!

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

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

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

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

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

填充是由 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一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM