PowerShell遍历DataSet取字段值仅返回首字符问题咨询
问题原因
这个行为是PowerShell的成员访问枚举特性和单元素集合自动展开特性共同导致的,具体逻辑如下:
- 当你调用
$rows.selectquery时,PowerShell会自动遍历$rows集合的每一行,取出每行的selectquery字段值汇总返回。 - 如果
$rows里的行数≥2,返回的结果是字符串数组,此时你加[$i]索引,就是取出数组中第i个位置的完整SQL字符串,符合预期。 - 如果
$rows里的行数=1,PowerShell不会返回长度为1的数组,而是直接把这个单行的selectquery字段的字符串值返回。此时你再加[$i]索引,就变成了对字符串本身做下标取值,自然只会拿到对应位置的单个字符,这就是你碰到只返回'S'的原因。
你遇到的“去掉[$i]正常,加回来又恢复”的现象,是因为操作时$rows的行数刚好发生了变化:去掉[$i]时如果$rows有≥2行,返回的是字符串数组,之后再加回[$i]时,操作对象是数组而不是字符串,就又正常了。
解决方法
- 方案1:既然已经用
foreach遍历每行,直接取当前行的字段即可,完全不需要额外维护索引变量,最稳妥:
$rows = $dataSet.Tables | Select-Object -Expand Rows foreach ($row in $rows) { $query = $row.selectquery # 执行业务逻辑 }
- 方案2:如果一定要用索引方式访问,强制把返回结果转为数组,避免单元素自动展开:
$query = @($rows.selectquery)[$i]
用@()包裹表达式会强制将结果转为数组,哪怕只有1个元素也会是数组类型,索引操作就会作用在数组上,不会误取字符串的单个字符。
内容的提问来源于stack exchange,提问作者Henrov
相关产品推荐
相关产品推荐

