Powershell .count函数无法按预期工作

Wil*_*yan 3 powershell

我正在尝试获取不带LastTaskResult'0' 的certian路径内服务器上所有计划任务的列表。仅显示所有故障。

我认为很简单的代码,但未如预期返回,我的代码是:

$var = Get-ScheduledTask | Get-ScheduledTaskInfo | select * | where {$_.TaskPath -eq "\"} 
$var = $var | select * | where {$_.LastTaskResult -ne 0}
$var.count
Run Code Online (Sandbox Code Playgroud)

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

如果我运行相同但使用-eq,那么它给我的计数为2(正确),有人遇到过此问题吗?

我环顾四周,但什么也看不到。

(请注意,我是Powershell的新手)

Dar*_*te1 7

您是正确的,Count并不总是在每种情况下都可靠。特别是在旧版本的PowerShell中不是如此。

请使用以下CmdLet:

$var | Measure-Object
Run Code Online (Sandbox Code Playgroud)

可以增强为:

if (($var | Measure-Object).Count -ne 0) {
    'We found stuff'
}
Run Code Online (Sandbox Code Playgroud)

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

Get-Help Measure-Command -ShowWindow
Run Code Online (Sandbox Code Playgroud)

就像@Lieven的答案一样,您也可以将结果强制为Array

@($var).count
$var = @(Get-Process | Select-Object -First 0); $var.count
Run Code Online (Sandbox Code Playgroud)

  • 完美,谁能想到 .count 不会很擅长计数!谢谢你的帮助 (2认同)

小智 6

如果您提前强类型变量,则可以避免这种情况。

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

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

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

PS C:> $var.count

1

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


Lie*_*ers 5

当管道返回单个结果时,$var变为PSCustomObject. APSCustomObject没有计数。当它返回多个结果时,您会得到一个数组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
Run Code Online (Sandbox Code Playgroud)