将数组元素添加到 PSObject

Adding array elements to a PSObject

前言:我没有接受过任何正式的剧本写作培训。所以我敢肯定你们中的许多人会撞到 table 想知道我在做什么。

我正在努力收集有关我们当前的 Teams 网站目录和各自网站所有者的信息。我有一个 PS 脚本来收集站点列表,然后循环遍历每个站点以获取所有者列表。在收集到所有者列表(存储在 var 中)后,我遍历该 var 以获取用户名并将每个用户名作为新元素存储在数组中。然后在向 PSObject 添加新成员时使用该元素,以便我可以将结果导出到 CSV。这是一些代码;

#Var's
    $Count = 1
    $TSO = New-Object PSObject
    $SiteOwner = @("SiteOwner0","SiteOwner1","SiteOwner2","SiteOwner3","SiteOwner4","SiteOwner5","SiteOwner6","SiteOwner7") #Array to create column headers in the CSV
    
#STEP 1: Get a list of the sites
    $Sites = get-team | sort-object DisplayName

#STEP 2: Get a list of the owners of the different sites
    FOREACH ($i in $Sites){
            $h = Get-TeamUser -GroupID $i.GroupID | Where {$_.role -eq "Owner"}
            $Count += 1

            Write-Host . -ForeGroundColor "Cyan" -NoNewLine
            #Add the new columns to $TSO
            $TSO | Add-Member -MemberType NoteProperty -Name "SiteName" -Value $i.DisplayName -Force
            $TSO | Add-Member -MemberType NoteProperty -Name "GroupOwner" -Value $i.Description -Force
            $TSO | Add-Member -MemberType NoteProperty -Name "Visibility" -Value $i.Visibility -Force
            $TSO | Add-Member -MemberType NoteProperty -Name "Archived" -Value $i.Archived -Force
            $TSO | Add-Member -MemberType NoteProperty -Name "SiteEmail" -Value $i.MailNickname -Force

            #loop through each member to discover the assigned role
            FOREACH ($o in $h){
                Write-Host . -ForeGroundColor "Cyan" -NoNewLine
                #Build the dynamics of the owners before passing to $TSO
                $OHolder += $o.user
                } #END NESTED FOREACH
                
                #Handle BLANK elements in the $OHolder array
                #The number 8 is the number of array elements we need a value for
                $Comp = 0
                
                While($Comp -lt 8){
                
                If($OHolder[$Comp] -ne $null){
                    $TSO | Add-Member -MemberType NoteProperty -Name $SiteOwner[$Comp] -Value $OHolder[$Comp] -Force
                    }
                ELSEIF(-not ($OHolder[$Comp])){
                    $OHolder[$Comp] = "NA"
                    $TSO | Add-Member -MemberType NoteProperty -Name $SiteOwner[$Comp] -Value $OHolder[$Comp] -Force
                    }
                    
                    #Increment the $Comp
                    $Comp += 1
                    
                }#END WHILE

                #Resetting the $Comp outside the loop
                $Comp = 0
#************* END STEP 2 *************************
            
            #Squirt out the info to a CSV
            $TSO | Export-CSV -Path $OPathOut -NoTypeInformation -Append -Force
            
            #Reset the $OHOLDER Array
            $OHolder = @()
    } #END FOREACH

我的问题是这样的;将站点所有者添加到站点所有者 ($TSO | Add-Member -MemberType NoteProperty -Name $SiteOwner[$Comp] -Value $OHolder[$Comp] -Force) 的 PS 对象时,它会将值的每个字符都计为一个元素。

例如:$OHolder 将有两个元素,$OHolder[0] 应该等于“doe@domain.com”,$OHolder[1] 应该等于“john@domain.com”。实际发生的是数组的长度变为 29(对于每个字符)而不是 2.

如何按预期将用户添加到 PS对象?现在输出将有:

SiteOwner0 | SiteOwner1 | SiteOwner2
d          | o          | e
@          |d           |o

您没有在使用 += 运算符之前定义 $OHolder 变量。

在这种情况下,默认情况下 powershell 似乎定义了一个字符串变量。

$undefVar = $null
$undefVar += "test"
$undefVar += "some"
# content of $undefVar is now testsome

尝试在循环FOREACH ($o in $h){

之前移动$OHolder = @()

不要使用 += 向数组添加项目。如果数组变大,效率很低。每次将当前数组内容读入内存后,都会创建一个新数组。您可以简单地输出 foreach 中的每个项目并将数组变量分配给 foreach 输出。

$OHolder = @(FOREACH ($o in $h){
    Write-Host . -ForeGroundColor "Cyan" -NoNewLine
    #Build the dynamics of the owners before passing to $TSO
    $o.user # Output 
})

在上面的简单示例中,甚至可能不需要循环,因为 $OHolder = ,$h.user 在 PowerShell v3+ 中应该足够了。