gpt4 book ai didi

arrays - 在PowerShell中动态向数组添加元素

转载 作者:行者123 更新时间:2023-12-02 23:10:43 25 4
gpt4 key购买 nike

我正在尝试对AD进行查询以提供用户列表。由于我们的组织将标记“LastName,FirstName”添加到计算机对象的描述字段中,因此我也想列出每个用户分配的计算机。这是我到目前为止所拥有的:

$ADGroup = "SomeADGroup"
$UserList = Get-ADGroupMember -Identity $ADGroup -Recursive `
| Select SamAccountName `
| foreach-object {(Get-ADUser -Identity $_.SamAccountName `
| Select @{n='AssignedUser';e={$_.Surname + ", " + $_.GivenName}}).AssignedUser}


$Results = New-Object System.Collections.Generic.List[System.Object]

foreach ($User in $UserList)
{
$MachineList = @(((Get-ADComputer -Filter "Description -like `"*$User*`"" | Select Name).Name) -join $_ + ",").ToUpper()

foreach ($Machine in $MachineList)
{
$Results +=
@{
'User' = $User
'Machine' = $Machine
}
}
}

$Results | ForEach-Object { [pscustomobject] $_ } | Format-Table

结果是这样的:
User                 Machine
---- -------

White, Scott W107175
Jones, Henry W107195
Flinstone, Fred L109531,W108812

由于可以为每位用户分配多台计算机,因此我试图找到一种向阵列动态添加“列”的方法,以便每个计算机名称元素都位于一列中。最终,这将使导出到CSV更加容易。我正在寻找类似于以下的输出:
User                 Machine   Machine2
---- ------- -------

White, Scott W107175
Jones, Henry W107195
Flinstone, Fred L109531 W108812

最佳答案

好的,因此您想向现有对象添加未知数量的属性。使用Add-Member cmdlet并不难。接下来,您只需要构建一个循环,以使添加这些属性变得容易理解,我们可以使用For循环来完成。最后,您需要确保数组中的第一条记录具有所有可能的属性。当我们到达那里时,我会再说明一点。

首先,我们获得用户。我更改了您的内容,因为我严格反对将反引号用作换行符,因为反引号很容易被空白挫败。我也将$UserList从字符串数组更改为对象数组,因为无论如何以后都需要对象。我们仍然捕获名字和姓氏,但是作为User[PSCustomObject]属性。

$ADGroup = "SomeADGroup"
$UserList = Get-ADGroupMember -Identity $ADGroup -Recursive |
Select SamAccountName |
foreach-object {
Get-ADUser -Identity $_.SamAccountName |
Select @{n='User';e={$_.Surname + ", " + $_.GivenName}}
}

因此,现在我们有了具有一个属性的对象数组。现在我们遍历整个过程,搜索计算机,然后将计算机捕获为字符串数组。那只是您已经修改过的代码。
foreach ($User in $UserList)
{
$MachineList = Get-ADComputer -Filter {Description -like "*$($User.User)*"} | Select -ExpandProperty Name

现在是我们稍微改变一下的地方。对于发现的每台机器,我们都需要向已经拥有的对象添加一个属性。因为我们不知道有多少个,所以我们可以使用 For循环并相应地为属性编号。
        for($i=0;$i -le $MachineList.Count;$i++)
{
Add-Member -InputObject $User -NotePropertyName "Machine$($i+1)" -NotePropertyValue $MachineList[$i]
}
}

因此,现在 $UserList是一个对象数组,每个对象都具有 User属性,但是还有许多适合该用户的 Machine#属性。问题是PowerShell会根据数组中的第一个对象输出对象数组。因此,在您的示例中:
User                 Machine   Machine2           
---- ------- -------
White, Scott W107175
Jones, Henry W107195
Flinstone, Fred L109531 W108812
Machine2列将永远不会显示,因为该属性在Scott White的第一条记录中不存在。因此,为了解决这个问题,我们需要找出数组中任何给定对象的所有可能的属性,并将所有缺失的属性添加到第一条记录中。使用PowerShell中每个对象都具有的 PSObject属性可以轻松完成此操作。

首先,我们获得所有可能的属性名称的列表:
$AllProps = $UserList | ForEach{$_.PSObject.Properties.Name} | Select -Unique

然后,我们过滤掉第一个记录上已经存在的所有属性,然后再次使用 Add-Member cmdlet将剩下的所有内容作为新属性添加到记录中。
$AllProps | 
Where{ $_ -notin $UserList[0].psobject.properties.name } |
ForEach{ Add-Member -InputObject $UserList[0] -NotePropertyName $_ -NotePropertyValue $null }

然后,除了输出结果,别无所要做,因为我们创建了用户列表,结果已经存储在 $UserList中,并且仅使用每个用户的计算机更新了现有列表,而不是先创建用户列表,然后再创建新的用户列表加机器。
$UserList |  Format-Table

关于arrays - 在PowerShell中动态向数组添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com