我试图在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来说很新)
答案 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
变为PSCustomObject
。 PSCustomObject
没有计数。当它返回多个结果时,您会得到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而不是集合一样。