我正在尝试获取不带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的新手)
您是正确的,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)
小智 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 更改。
当管道返回单个结果时,$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)
| 归档时间: |
|
| 查看次数: |
9771 次 |
| 最近记录: |