Powershell太聪明了

时间:2009-05-27 03:20:56

标签: powershell

道歉可能是一个新的问题。

我正在编写一些针对AD运行各种查询的Powershell脚本。他们通常会返回一堆易于处理的结果,即:

$results = myQuery
write-host "Returned " + $results.Count + " results."
foreach ($result in $results) { doSomething }

不用担心。但是,如果只有1个结果,Powershell会自动将该结果转换为单个对象,而不是包含1个对象的数组。所以上面的代码会在Count和foreach中破坏。我确信0结果会出现同样的问题。

有人会建议一种优雅的方式来处理这个问题吗?也许某种方式来投射结果,所以它们总是一个数组?

3 个答案:

答案 0 :(得分:11)

将第一行代码更改为

$results = @(myQuery)

这将始终返回一个数组。有关其他详细信息,请参阅this blog entry

答案 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

相关问题