Powershell .count函数无法正常工作

时间:2016-04-12 13:08:08

标签: powershell

我试图在certian路径中的服务器上获取所有计划任务的列表,该路径中没有LastTaskResult的' 0'。只显示所有失败。

我认为简单的代码,但它没有按预期返回,我的代码是:

$var = Get-ScheduledTask | Get-ScheduledTaskInfo | select * | where {$_.TaskPath -eq "\"} 
$var = $var | select * | where {$_.LastTaskResult -ne 0}
$var.count

如果我删除第二行,我可以看到返回了一个值,但计数没有返回任何内容(甚至不返回0)

如果我运行相同但使用-eq然后它给我一个2的计数是正确的,之前有人遇到过这个问题吗?

我看了一眼,但我可以看到任何东西。

(请注意,我对Powershell来说很新)

4 个答案:

答案 0 :(得分:4)

你是对的,Count并不总是对每种情况都可靠。特别是在旧版本的PowerShell中没有。

请使用以下CmdLet:

$var | Measure-Object

这可以增强到:

if (($var | Measure-Object).Count -ne 0) {
    'We found stuff'
}

键入以下内容时可以找到有关此CmdLet的更多信息:

Get-Help Measure-Command -ShowWindow

在@Lieven的答案中,您也可以将结果强制为Array

@($var).count

答案 1 :(得分:1)

当管道返回单个结果时,$var变为PSCustomObjectPSCustomObject没有计数。当它返回多个结果时,您会得到PSCustomObjects数组,并且您可以使用计数。

您可以使用GetType()来确定结果类型

($var | select * | where {$_.LastTaskResult -ne 0}).GetType()

现在我知道解决这个问题的最简单方法是明确设置变量的类型

$var = Get-ScheduledTask | Get-ScheduledTaskInfo | select * | where {$_.TaskPath -eq "\"} 
[PSCustomObject[]]$var = $var | select * | where {$_.LastTaskResult -ne 0}
$var.count

答案 2 :(得分:0)

如果您提前强烈输入变量,则可以避免这种情况。

PS C:> [array] $ var = @()

PS C:> $ var = Get-ScheduledTask | Get-ScheduledTaskInfo |选择* |其中{$ _.TaskPath -eq" \"}

PS C:> $ var = $ var |选择* |其中{$ _.LastTaskResult -ne 0}

PS C:> $ var.count

1

这将确保$ var始终是一个数组,并且不会被PS更改。

答案 3 :(得分:0)

我发现,如果我将数组声明为空数组,然后向其中添加项目(+ =),而不是为其分配结果,那么计数就可以了。

$ servers = @()

$ Servers + = Get-ADComputer -Server $ domain -Filter {samaccountname -eq'OneServer01 $'}} -SearchBase $ serverOU -SearchScope子树|选择名称,专有名称

$ Servers.Count现在将显示为1,其中简单地使用=根本不显示任何内容,就像被视为PSCustomObject而不是集合一样。