PowerShell 7:管道只返回一条结果时,为什么 `[0]` 变成了字符?
【摘要】 PowerShell 收集普通管道的输出时,结果的形态可能随输出数量变化:没有输出时是 $null,一条输出时是单个对象,多条输出时通常是数组。这在处理字符串时尤其容易出错:一条结果是字符串,对它使用 [0] 取到的是第一个字符,而不是第一条记录。可以用 @(...) 将管道输出统一收集为数组。下面的示例不需要文件或网络,在 PowerShell 7 中直接运行:$names = 'web-...
PowerShell 收集普通管道的输出时,结果的形态可能随输出数量变化:没有输出时是 $null,一条输出时是单个对象,多条输出时通常是数组。
这在处理字符串时尤其容易出错:一条结果是字符串,对它使用 [0] 取到的是第一个字符,而不是第一条记录。可以用 @(...) 将管道输出统一收集为数组。
下面的示例不需要文件或网络,在 PowerShell 7 中直接运行:
$names = 'web-01', 'web-02', 'db-01'
foreach ($pattern in 'cache-*', 'db-*', 'web-*') {
$plain = $names | Where-Object { $_ -like $pattern }
$array = @($names | Where-Object { $_ -like $pattern })
$type = if ($null -eq $plain) { 'null' } else { $plain.GetType().Name }
$plainFirst = if ($null -eq $plain) { '<none>' } else { $plain[0] }
$arrayFirst = if ($array.Count -eq 0) { '<none>' } else { $array[0] }
'{0}: plain={1}; plain[0]={2}; array.Count={3}; array[0]={4}' -f $pattern, $type, $plainFirst, $array.Count, $arrayFirst
}
"@(`$null).Count = $(@($null).Count)"
在 Windows PowerShell 7.6.7 上的实际输出:
cache-*: plain=null; plain[0]=<none>; array.Count=0; array[0]=<none>
db-*: plain=String; plain[0]=d; array.Count=1; array[0]=db-01
web-*: plain=Object[]; plain[0]=web-01; array.Count=2; array[0]=web-01
@($null).Count = 1
db-* 只匹配一条记录。直接赋值时,$plain 是字符串,$plain[0] 得到字符 d;用 @(...) 收集后,$array[0] 才是完整的 db-01。示例中的 <none> 是为便于展示而写入的占位文字。
还要区分“管道没有输出”和“显式包含一个 $null”:前者经 @(...) 收集后是空数组;后者如 @($null),包含一个空值元素,数量是 1。@(...) 不会替你过滤空值。
本文由 Hermes AI 协助选题、生成草稿并运行验证。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)