如何优化PowerShell中数组添加用户信息的嵌套判断逻辑以实现更简洁代码
简化PowerShell重复代码与数组判断的技巧
嘿,这个重复代码的问题太常见了,咱们完全可以用更简洁的逻辑搞定,甚至还能顺便优化性能~
第一步:合并嵌套if,消除重复代码
你原来的嵌套if是为了处理数组初始为空的情况,但其实PowerShell的-contains运算符在面对空数组时会返回$false,咱们可以把两个条件合并成一个判断:
$userList = @() Get-Content $sourceFile | % { <SOME CODE HERE> # 合并后的单个判断,覆盖空数组和已存在的情况 if (-not ($userList.userAccount -contains $userAccount)) { $userList += addUser -userName $userName -userDomain $userDomain -userAccount $userAccount } $userAdAttribute = $userList.Where({$_.userAccount -eq $userAccount})."<AD ATTRIBUTE NAME HERE>" } <SOME CODE HERE>
为什么这能行?
当$userList是空数组时,$userList.userAccount会返回$null,$null -contains $userAccount的结果是$false,取反后就是$true,自然会执行添加操作;当数组非空时,就会正常检查账号是否已存在,完全覆盖你原来的两种场景,直接去掉了嵌套和重复代码。
第二步:进阶优化——用哈希表提升性能
如果你的用户列表比较大,数组的-contains每次都要遍历整个数组,效率会越来越低。这时候推荐用**哈希表(Hashtable)**来存储用户,因为哈希表的键查找是O(1)的时间复杂度,速度快很多:
# 初始化哈希表,键用userAccount,值存用户对象 $userTable = @{} Get-Content $sourceFile | % { <SOME CODE HERE> if (-not $userTable.ContainsKey($userAccount)) { $userObj = addUser -userName $userName -userDomain $userDomain -userAccount $userAccount $userTable[$userAccount] = $userObj } # 直接通过键获取属性,比数组的Where方法快得多 $userAdAttribute = $userTable[$userAccount]."<AD ATTRIBUTE NAME HERE>" } <SOME CODE HERE> # 如果之后需要数组形式的用户列表,直接转换即可 $userList = $userTable.Values
这样不仅代码更简洁,处理大量数据时的性能提升会非常明显,而且获取用户属性的方式也更直接。
内容的提问来源于stack exchange,提问作者kal3js
相关产品推荐
相关产品推荐

