如何从Powershell访问COM对象上的索引属性

如何从Powershell访问COM对象上的索引属性,com,powershell,Com,Powershell,我正在使用Powershell通过COM(例如ITaskDefinition)与Windows 7任务计划程序服务进行对话。我想从ITaskDefinition上的集合中取出一个特定触发器。提取特定触发器的正确方法似乎是通过属性,这是一个索引属性 我的第一次尝试如下所示: $sched = New-Object -Com "Schedule.Service" $sched.Connect() $folder = $sched.GetFolder('\') $task = $folder.GetT

我正在使用Powershell通过COM(例如ITaskDefinition)与Windows 7任务计划程序服务进行对话。我想从ITaskDefinition上的集合中取出一个特定触发器。提取特定触发器的正确方法似乎是通过属性,这是一个索引属性

我的第一次尝试如下所示:

$sched = New-Object -Com "Schedule.Service"
$sched.Connect()
$folder = $sched.GetFolder('\')
$task = $folder.GetTask("some task")
$triggers = $task.Definition.Triggers
$trigger = $triggers[0]
但是,最后一行失败,并显示以下消息:

Unable to index into an object of type System.__ComObject.
我尝试过这个主题的一些其他变体,例如,
$triggers.Item(0)
,但都没有运气。我猜这与
$trigger
是一个COM对象有关,因为我认为索引属性在其他类型上工作良好


有人知道这样做的正确方法吗?

在我的系统上,看起来有些任务只返回一个触发器。您可以尝试强制它以数组形式返回

$sched = New-Object -Com "Schedule.Service"
$sched.Connect()
$folder = $sched.GetFolder('\')
$task = $folder.GetTask("some task")
$triggers = @($task.Definition.Triggers)
$trigger = $triggers[0]

这个项目确实有效。您必须使用Item()而不是Item[],并且索引是基于1的

$sched = New-Object -Com "Schedule.Service"
$sched.Connect()
$folder = $sched.GetFolder('\')
$task = $folder.GetTask("Update Bin Dir")
$triggers = $task.Definition.Triggers
$triggers.Item(1)

Type               : 2
Id                 : 67a9fad4-462f-43d9-ab71-6e9b781966e6
Repetition         : System.__ComObject
ExecutionTimeLimit : 
StartBoundary      : 2007-07-02T05:30:00
EndBoundary        : 
Enabled            : True
DaysInterval       : 1
RandomDelay        : 
如果不需要按索引访问,则使用枚举器也可以:

foreach ($trigger in $triggers) { $trigger }

酷,这似乎是一个很好的解决办法。我希望有人会知道如何“正确地”做这件事,但这会让我现在就去做。很棒的解决方法。我试图将其转换为数组,但完全忘记了这是对此类对象执行此操作的正确方法。谢谢谢谢,这似乎也行。不过,还是希望有人知道一种更直接的方法。是的,这让我很烦。:-)您知道,按照同样的注释,下面的代码似乎是有效的:foreach($task.Definition.Triggers中的触发器){$trigger}非常好;我就是因为没有仔细阅读文档而得到的。谢谢你在追踪这个方面所做的努力。做了这么长时间的.NET,基于1的索引这件事让我困惑了一段时间。感谢x0n在这方面的帮助。