Arrays 从包含多个用户的循环创建Powershell对象
我需要创建一个Powershell对象、数组或哈希表来存储用户列表和分类详细信息,这些信息是从CSV文件中提取的,并使用Get ADUser进行定位。详情如下: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
$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]@{