关于PowerShell哈希表赋值代码的逻辑疑问
这段PowerShell代码的逻辑解析
先明确代码的核心目标:把SQL查询结果中,同一个员工(按employee_number区分)的所有a_segment_5值,整理成「员工号→对应分段值数组」的哈希表结构。
循环内逻辑分步拆解
首次处理某员工号时
哈希表$empExtraDepts刚创建是空的,第一次遇到某个employee_number时,$empExtraDepts[$_.employee_number]确实是$null。这时候执行if判断里的代码,给这个员工号对应的键赋值一个空数组@()——这一步是为后续追加元素做准备,确保值的类型是数组,而不是单个字符串。追加当前分段值
不管是首次创建数组后,还是后续处理同员工号的行,都会执行$empExtraDepts[$_.employee_number] += $_.a_segment_5.Trim():- 首次:空数组加上第一个分段值,变成包含单个元素的数组
- 非首次:直接把新的分段值追加到已有的数组末尾
举个实际例子理解
假设SQL返回以下结果:
| employee_number | a_segment_5 |
|---|---|
| 1001 | DeptA |
| 1001 | DeptB |
| 1002 | DeptC |
代码执行过程:
- 处理第一行(1001/DeptA):哈希表无1001键→创建空数组→追加DeptA,哈希表变为
@{1001 = @('DeptA')} - 处理第二行(1001/DeptB):哈希表已有1001键→直接追加DeptB,哈希表变为
@{1001 = @('DeptA','DeptB')} - 处理第三行(1002/DeptC):哈希表无1002键→创建空数组→追加DeptC,哈希表变为
@{1001 = @('DeptA','DeptB'); 1002 = @('DeptC')}
为什么必须加这个if判断?
如果去掉if判断直接执行+=,第一次处理员工号时,$null += 'DeptA'会直接得到字符串DeptA,而不是数组。后续再处理同员工号的行时,'DeptA' += 'DeptB'会变成字符串拼接DeptADeptB,完全达不到「一个员工对应多个分段值」的需求。
内容的提问来源于stack exchange,提问作者dmw_code
相关产品推荐
相关产品推荐

