道歉可能是一个新的问题。
我正在编写一些针对AD运行各种查询的Powershell脚本。他们通常会返回一堆易于处理的结果,即:
$results = myQuery
write-host "Returned " + $results.Count + " results."
foreach ($result in $results) { doSomething }
不用担心。但是,如果只有1个结果,Powershell会自动将该结果转换为单个对象,而不是包含1个对象的数组。所以上面的代码会在Count和foreach中破坏。我确信0结果会出现同样的问题。
有人会建议一种优雅的方式来处理这个问题吗?也许某种方式来投射结果,所以它们总是一个数组?
答案 0 :(得分:11)
答案 1 :(得分:1)
实际上,foreach工作得很好。 foreach的所有用法(foreach关键字,Foreach-Object cmdlet和Foreach-Object的别名“foreach”和“%”)都具有相同的行为,如果需要,可以在数组中“包装”相关对象。因此,foreach的所有用法都适用于标量和数组值。
令人讨厌的是,这意味着它们也可以使用空值。说我做:
$x = $null
foreach ($y in $x) {Write-Host "Hello world 1"}
$x | Foreach-Object {Write-Host "Hello world 2"}
我会得到
"Hello world 1"
"Hello world 2"
。
答案 2 :(得分:0)
这也困扰了我。关于如何修复$results.Count
没有聪明的想法,但可以通过切换到管道来修复foreach。
$scalar = 1
$list = (1,2)
$list | % { $_ }
打印 1 2
$scalar | % { $_ }
打印 1