PowerShell中获取Select语句查询结果行数异常问题
问题分析与解决
核心错误点
对
DataTable.Select()返回值的误解DataTable.Select()执行后返回的是DataRow对象的数组,而非带Rows属性的DataTable/DataView。原代码中$oRs.Rows.Count的写法完全错误,应该直接用$oRs.Count获取匹配行数。变量名大小写不一致
原代码中赋值变量为$oRs,但判断时写成$oRS.Rows.Count,虽然PowerShell大小写不敏感,但这种写法容易引发混淆,建议保持变量名一致。
修复后的代码
$inMemDB = New-Object System.Data.Datatable [void]$inMemDB.Columns.Add("sEmailAddress") [void]$inMemDB.Columns.Add("sSamAccountName") [void]$inMemDB.Columns.Add("nPhoneNumber") [void]$inMemDB.Columns.Add("sFirstName") [void]$inMemDB.Columns.Add("sLastName") [void]$inMemDB.Columns.Add("sDisplayName") [void]$inMemDB.Columns.Add("sDepartment") $recordCount = 0 Import-Csv $cachedEmpCSV | ForEach-Object { [void]$inMemDB.Rows.Add($_.sEmailAddress,$_.sSamAccountName,$_.nPhoneNumber,$_.sFirstName,$_.sLastName,$_.sDisplayName,$_.sDepartment ) } Write-Host "总记录数: $($inMemDB.Rows.Count)" # 执行查询,返回匹配的DataRow数组 $matchingRows = $inMemDB.Select("sEmailAddress = 'test@test.com'") Write-Host "匹配记录数: $($matchingRows.Count)" If ($matchingRows.Count -eq 1) { # 数组索引访问具体行的属性 Write-Host "匹配的SamAccountName: $($matchingRows[0].sSamAccountName)" }
额外排查方向
如果修复后仍无法查询到记录,检查以下内容:
- CSV文件中
sEmailAddress列值是否存在前后空格,可在添加数据时用$_.sEmailAddress.Trim()去除 - 邮箱地址的大小写差异,需忽略大小写的话,修改查询语句为:
$matchingRows = $inMemDB.Select("sEmailAddress LIKE 'test@test.com'", $null, [System.Data.DataViewRowState]::CurrentRows, [System.Data.CompareOptions]::IgnoreCase) - 确认
$cachedEmpCSV路径正确,且文件确实包含目标邮箱记录
内容的提问来源于stack exchange,提问作者Clarence
相关产品推荐
相关产品推荐

