如何用PowerShell提取Excel中Mod_user列的唯一值(附现有代码)
提取Excel中Mod_user列的唯一值解决方案
没问题,我来帮你搞定提取Mod_user列唯一值的需求!先帮你修正原代码里的小问题,再实现你要的功能:
原代码的几个小问题
- 创建对象时拼写错误:
psobjectl应该是psobject - 没有把每行的对象存入数组,导致最后没有数据集合可以处理
- 初始化
$myarray的方式不符合需求,我们需要一个空数组来存储所有行数据
修改后的完整代码
# 选择要读取的Excel文件 $file = "C:\Gopi_Kishan\DBBR\Build\Build_Scripts\test.xlsx" $sheetName = "Sheet1" # 创建Excel COM对象 $excel = New-Object -com Excel.Application # 设置Excel不可见,避免弹出窗口 $excel.Visible = $false # 打开Excel文件 $wb = $excel.workbooks.open($file) # 选择要读取的工作表 $sheet = $wb.Worksheets.Item($sheetname) # 获取已使用区域的总行数 $rowMax = ($sheet.UsedRange.Rows).Count # 创建空数组,用于存储所有行的数据对象 $allData = @() # 遍历从第2行开始的数据行(假设第1行是表头) for ($i = 2; $i -le $rowMax; $i++) { # 创建新的自定义对象,存储当前行的数据 $objTemp = [pscustomobject]@{ Sno = $sheet.Cells.Item($i,1).Text Issue_id = $sheet.Cells.Item($i,5).Text Mod_user = $sheet.Cells.Item($i,6).Text Reviewed = $sheet.Cells.Item($i,7).Text Request_number = $sheet.Cells.Item($i,8).Text } # 将当前行对象添加到数组中 $allData += $objTemp } # 关闭Excel文件和COM对象,避免进程残留 $wb.Close($false) $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null # 提取Mod_user列的唯一值 $uniqueModUsers = $allData | Select-Object -ExpandProperty Mod_user -Unique # 输出结果验证 Write-Host "所有唯一的Mod_user值:" $uniqueModUsers | ForEach-Object { Write-Host "- $_" }
关键功能说明
- 简化对象创建:改用
[pscustomobject]更简洁地创建自定义对象,避免原代码里的拼写错误和繁琐的Add-Member操作 - 数据收集:用
$allData数组存储每一行的数据对象,这样后续可以对整个数据集进行处理 - 提取唯一值:使用
Select-Object -ExpandProperty Mod_user -Unique直接从数组中提取Mod_user的唯一值,这是PowerShell处理唯一值的标准方法 - 清理资源:添加了关闭Excel和释放COM对象的代码,避免Excel进程在后台残留占用资源
现在你可以用$uniqueModUsers这个变量来获取所有唯一的Mod_user值,直接用于后续发送邮件的逻辑啦!
内容的提问来源于stack exchange,提问作者Kishan M
相关产品推荐
相关产品推荐

