如何在PowerShell数组中添加从Active Directory获取的新数据行?
解决PowerShell脚本CSV仅保留最后一条用户记录的问题
问题原因
你的脚本每次执行$AddUser脚本块时,都会重新创建$array数组,只存储当前用户的数据;加上递归调用的方式,导致之前的用户数据无法累积,最终导出CSV时只有最后一条记录。
修改后的完整脚本
Import-Module ActiveDirectory # 初始化存储所有用户数据的数组 $userArray = @() # 初始输入iviisID [int]$iviisID = Read-Host "Enter iViis ID number" do { $name = Read-Host "Enter username (first.last)" $number = Read-Host "Enter users Phone Number" # 处理性别输入 $genderInput = Read-Host "Enter 1 for Male, 2 for Female" $gender = if ($genderInput -eq 1) { "Male" } else { "Female" } # 处理角色输入 $roleInput = Read-Host "Enter 1 for Foreman, 2 for Contract Manager" $role = if ($roleInput -eq 1) { "Foreman@er" } else { "ContractManager@er" } # 仅获取需要的AD用户属性,提升效率 $user = Get-ADUser -Identity $name -Properties givenName, sn, employeeID, mail # 直接提取AD用户属性,无需foreach $firstName = $user.givenName $lastName = $user.sn $employeeID = $user.employeeID $email = $user.mail # 创建当前用户的对象 $userObject = [PSCustomObject] @{ FirstName = $firstName Surname = $lastName FirstNames = $firstName LastName = $lastName EMPLOYEEID = $iviisID PGID = $employeeID EmployeeCode = $iviisID UserID = "$iviisID@er" ENABLEDFLAG = "1" EmailAddress = $email PersonalPhoneNumber = $number Role = $role Password = "plant.box.dog" Gender = $gender PreferredName = $firstName Category = "Employee" } # 将当前用户对象添加到全局数组 $userArray += $userObject # 询问是否继续添加用户 $newUser = Read-Host "Would you like to add another user? (y/n)" # iviisID自增 if ($newUser -eq 'y') { $iviisID++ } } while ($newUser -eq 'y') # 循环结束后统一导出所有用户数据到CSV $userArray | Export-CSV -NoTypeInformation -Path C:\Test\Employees.csv
关键修改说明
- 数组初始化移至外部:
$userArray = @()在循环外定义,确保所有用户对象都添加到同一个数组中,不会被覆盖。 - 替换递归为do-while循环:循环逻辑更直观,避免递归带来的变量作用域混乱,便于数据累积。
- 优化AD用户属性获取:
Get-ADUser仅指定需要的属性,比Properties *更高效,减少不必要的数据加载。 - 直接提取属性值:无需用
foreach遍历单个用户对象,直接通过.访问属性即可。 - 统一导出CSV:在所有用户添加完成后,一次性导出整个数组,确保所有记录都被写入。
内容的提问来源于stack exchange,提问作者csteel217
相关产品推荐
相关产品推荐

