Arrays 从包含多个用户的循环创建Powershell对象

Arrays 从包含多个用户的循环创建Powershell对象,arrays,loops,object,powershell,hashtable,Arrays,Loops,Object,Powershell,Hashtable,我需要创建一个Powershell对象、数组或哈希表来存储用户列表和分类详细信息,这些信息是从CSV文件中提取的,并使用Get ADUser进行定位。详情如下: $userList = Import-CSV $CSVInputFile $users = @{} Foreach ($csvUser in $userList) { $userSearchString = $csvUser | Select -ExpandProperty SamAccountName $current

我需要创建一个Powershell对象、数组或哈希表来存储用户列表和分类详细信息,这些信息是从CSV文件中提取的,并使用Get ADUser进行定位。详情如下:

$userList = Import-CSV $CSVInputFile
$users = @{}
Foreach ($csvUser in $userList)
{
    $userSearchString = $csvUser | Select -ExpandProperty SamAccountName
    $currentUser = (Get-ADUser -Filter {SamAccountName -eq $userSearchString} `
        -Properties PasswordExpired,PasswordLastSet,EmailAddress |
            Where {$_.Enabled -eq "True"})

    If ($currentUser.EmailAddress -ne $null)
    {
        $currentUserEmailString = $csvUser | Select -ExpandProperty EmailAddress
        $currentUserEmailString = ($currentUserEmailString -as [string])
        $currentUser.EmailAddress = $currentUserEmailString
    }

    $Users = New-Object PSObject -Property @{
        DistinguishedName = $currentUser.DistinguishedName
        EmailAddress = $currentUser.EmailAddress    
        Enabled = $currentUser.Enabled          
        GivenName = $currentUser.GivenName       
        Name = $currentUser.Name
        PasswordExpired = $currentUser.PasswordExpired
        PasswordLastSet = $currentUser.PasswordLastSet
        SamAccountName = $currentUser.SamAccountName
        Surname = $currentUser.Surname
    }
    $Users
}
如何将循环每次迭代的每个用户的详细信息添加到对象中

我希望最终得到一个包含多个用户详细信息的对象,与Get ADUser直接输出的结果相同:

Name        SamAccountName EmailAddress                    
----        -------------- ------------                    
User1       user1      user1@domain.com    
User2       user2      user2@domain.com                         
User3       user3      user3@domain.com

任何帮助都将不胜感激

将$users定义为数组

$users = @()
并将新对象附加到$Users中

$Users += New-Object

将$users定义为数组

$users = @()
并将新对象附加到$Users中

$Users += New-Object

将$users定义为数组

$users = @()
并将新对象附加到$Users中

$Users += New-Object

将$users定义为数组

$users = @()
并将新对象附加到$Users中

$Users += New-Object

不确定我是否错过了这一点,但我看到您正在循环中构建一个自定义对象。我所看到的唯一问题是,在每次循环后都没有保留结果。相反,您正在销毁历史上的对象

我会将
$users
的声明更改为数组
$users=@()
,而不是将用户哈希表填充到用户中,而是将当前对象添加到数组中。然后,您将拥有一个哈希表数组:

$Users += New-Object PSObject -Property @{...
然后,您可以将
$Users
输出行放在循环之外,这样您就拥有了整个过程。然后您可以直接输出到
选择
以获得所需的输出

$Users | Select-Object name,SamAccountName,EmailAddress
不过,这种方法有一个潜在的主要缺点。在数组上使用
+=
时,将为新元素创建一个新数组并调整其大小,而旧数组将被丢弃。这对较大阵列的性能有很大影响


更好的方法是利用管道。当您拥有更大的用户群时,这将是一个性能提升

Import CSV$CSVInputFile | ForEach对象{
$userSearchString=$\u0.SamAccountName
$currentUser=Get ADUser-Filter{SamAccountName-eq$userSearchString}`
-属性PasswordExpired、PasswordLastSet、EmailAddress|
其中{$\.Enabled-eq“True”}
If($currentUser.EmailAddress-ne$null){
$currentUser.EmailAddress=$\ux.EmailAddress
}
[pscustomobject][ordered]@{
DifferentizedName=$currentUser.DifferentizedName
#…截断
姓氏=$currentUser.namname
}
}

现在,您可以将其发送到类似于导出CSV的
或将其保存到变量中。你的选择现在是开放的
[pscustomobject][ordered]
PowerShell v3.0+

中是否提供了类型加速器不确定我是否遗漏了这一点,但我发现您正在循环中构建自定义对象。我所看到的唯一问题是,在每次循环后都没有保留结果。相反,您正在销毁历史上的对象

我会将
$users
的声明更改为数组
$users=@()
,而不是将用户哈希表填充到用户中,而是将当前对象添加到数组中。然后,您将拥有一个哈希表数组:

$Users += New-Object PSObject -Property @{...
然后,您可以将
$Users
输出行放在循环之外,这样您就拥有了整个过程。然后您可以直接输出到
选择
以获得所需的输出

$Users | Select-Object name,SamAccountName,EmailAddress
不过,这种方法有一个潜在的主要缺点。在数组上使用
+=
时,将为新元素创建一个新数组并调整其大小,而旧数组将被丢弃。这对较大阵列的性能有很大影响


更好的方法是利用管道。当您拥有更大的用户群时,这将是一个性能提升

Import CSV$CSVInputFile | ForEach对象{
$userSearchString=$\u0.SamAccountName
$currentUser=Get ADUser-Filter{SamAccountName-eq$userSearchString}`
-属性PasswordExpired、PasswordLastSet、EmailAddress|
其中{$\.Enabled-eq“True”}
If($currentUser.EmailAddress-ne$null){
$currentUser.EmailAddress=$\ux.EmailAddress
}
[pscustomobject][ordered]@{
DifferentizedName=$currentUser.DifferentizedName
#…截断
姓氏=$currentUser.namname
}
}

现在,您可以将其发送到类似于导出CSV的
或将其保存到变量中。你的选择现在是开放的
[pscustomobject][ordered]
PowerShell v3.0+

中是否提供了类型加速器不确定我是否遗漏了这一点,但我发现您正在循环中构建自定义对象。我所看到的唯一问题是,在每次循环后都没有保留结果。相反,您正在销毁历史上的对象

我会将
$users
的声明更改为数组
$users=@()
,而不是将用户哈希表填充到用户中,而是将当前对象添加到数组中。然后,您将拥有一个哈希表数组:

$Users += New-Object PSObject -Property @{...
然后,您可以将
$Users
输出行放在循环之外,这样您就拥有了整个过程。然后您可以直接输出到
选择
以获得所需的输出

$Users | Select-Object name,SamAccountName,EmailAddress
不过,这种方法有一个潜在的主要缺点。在数组上使用
+=
时,将为新元素创建一个新数组并调整其大小,而旧数组将被丢弃。这对较大阵列的性能有很大影响


更好的方法是利用管道。当您拥有更大的用户群时,这将是一个性能提升

Import CSV$CSVInputFile | ForEach对象{
$userSearchString=$\u0.SamAccountName
$currentUser=Get ADUser-Filter{SamAccountName-eq$userSearchString}`
-属性PasswordExpired、PasswordLastSet、EmailAddress|
其中{$\.Enabled-eq“True”}
If($currentUser.EmailAddress-ne$null){
$currentUser.EmailAddress=$\ux.EmailAddress
}
[pscustomobject][ordered]@{