PowerShell脚本中Email、Office列显示System.Object[]问题求助
PowerShell脚本问题排查:
System.Object[]显示及datafile02数据失效原因 我搞不懂为啥PowerShell脚本里Email和Office列显示System.Object[]而不是对应值,也不知道为什么datafile02的数据没法正常生效,但datafile01的可以。以下是相关代码、输出及修复代码,排查原因如下:
初始报错代码
Set-StrictMode -Version latest $txt1 = "C:\Users\Alex\Downloads\New folder\datafile01.txt" $txt2 = "C:\Users\Alex\Downloads\New folder\datafile02.txt" $newtxt = "C:\Users\Alex\Downloads\New folder\new.txt" #Import Data from TXT and add headers $d1 = import-csv $txt1 -Header UID,HDATE,EMAIL,OFFICE -Delimiter `t | Select-Object -Property UID,EMAIL,HDATE,OFFICE $d2 = import-csv $txt2 -Header UID2, EMAIL, OFFICE -Delimiter `t | Select-Object -Property EMAIL, OFFICE #Create new Table and Columns $table = New-Object system.Data.DataTable "Employee Table" $newcol = New-Object system.Data.DataColumn UID; $table.columns.add($newcol) $newcol = New-Object system.Data.DataColumn EMAIL; $table.columns.add($newcol) $newcol = New-Object system.Data.DataColumn HDATE; $table.columns.add($newcol) $newcol = New-Object system.Data.DataColumn OFFICE; $table.columns.add($newcol) # Add a DataTable row $row = $table.NewRow() $row.UID= ($d1.UID) $row.EMAIL= ($d2.email) $row.HDATE= ($d1.HDATE) $row.OFFICE= ($d2.OFFICE) $table.Rows.Add($row) #Grab data from TXT $d1 | ForEach-Object { $row = $table.NewRow() $row.UID= ($_.UID) $row.EMAIL= ($d2.EMAIL) $row.HDATE= ($_.HDATE) $row.OFFICE= ($d2.OFFICE) $table.Rows.Add($row) } # Get the data out $table
运行输出
UID EMAIL HDATE OFFICE --- ----- ----- ------ System.Object[] System.Object[] System.Object[] System.Object[] 25328 System.Object[] 5/31/2023 System.Object[] 57467 System.Object[] 9/14/2023 System.Object[] 55373 System.Object[] 1/21/2023 System.Object[] 41186 System.Object[] 6/15/2023 System.Object[] 60961 System.Object[] 3/14/2023 System.Object[]
Datafile01内容
25328 5/31/2023 57467 9/14/2023 55373 1/21/2023 41186 6/15/2023 60961 3/14/2023
Datafile02内容
25328 bdbrown@att.net Memphis 57467 boser@verizon.net Portland 55373 tfinniga@optonline.net Kansas City 68730 meinkej@sbcglobal.net Huntington 41186 tubajon@outlook.com Santa Ana 60961 dwheeler@contoso.com Detriot
可行修复代码
Set-StrictMode -Version latest $txt1 = "C:\Users\Alex\Downloads\New folder\datafile01.txt" $txt2 = "C:\Users\Alex\Downloads\New folder\datafile02.txt" #Import Data from TXT and add headers $d1 = import-csv $txt1 -Delimiter `t -Header UID, SDate $d2 = import-csv $txt2 -Delimiter `t -header UID, EMAIL, OFFICe $d1 | ForEach-Object { $DataMatch = $d2 | Where-Object -Property UID -eq $_.UID [PSCustomObject]@{ UID = $_.UID Date = $_.SDate Email = $DataMatch.Email OFFICE = $DataMatch.OFFICE } }
问题原因分析
1. System.Object[]显示的根源
- 初始代码中直接将整个数据集的字段集合赋值给DataTable行的单个字段,比如
$row.EMAIL= ($d2.email),$d2.email是datafile02所有Email值组成的数组,而非单个匹配值,因此PowerShell显示数组类型标识System.Object[]。 - 循环逻辑中同样犯了这个错误:没有根据当前行的UID匹配对应的datafile02记录,而是直接把整个
$d2.EMAIL数组赋值给每行的Email字段。
2. datafile02数据不生效的原因
- 导入datafile02时,指定的Header为
UID2, EMAIL, OFFICE,但后续用Select-Object -Property EMAIL, OFFICE丢弃了UID2字段,导致失去了关联两个数据集的唯一标识,根本无法匹配对应记录。 - 导入datafile01时错误指定了4个Header(
UID,HDATE,EMAIL,OFFICE),但实际datafile01只有2个字段,属于冗余定义,且后续也没用到这些多余字段。 - 整体逻辑缺失按UID关联两个数据集的核心步骤,只是盲目将datafile02的所有Email/Office值批量赋值,完全没用到对应UID的具体数据。
3. 修复代码生效的关键
- 导入数据时正确匹配了文件的字段数量:datafile01对应2个Header(
UID, SDate),datafile02对应3个Header(UID, EMAIL, OFFICE),没有冗余或缺失。 - 加入了按UID匹配记录的逻辑:
$DataMatch = $d2 | Where-Object -Property UID -eq $_.UID,确保每个datafile01的记录都能找到对应的datafile02记录,取到单个有效的Email和Office值。 - 使用
[PSCustomObject]直接构造输出对象,替代手动创建DataTable的复杂逻辑,避免了数组赋值的低级错误,代码更简洁直观。
内容的提问来源于stack exchange,提问作者CuriousCoder
相关产品推荐
相关产品推荐

