将数组元素添加到 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+ 中应该足够了。
前言:我没有接受过任何正式的剧本写作培训。所以我敢肯定你们中的许多人会撞到 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+ 中应该足够了。