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

时间:2009-11-03 17:49:06

标签: com powershell

我正在使用Powershell通过COM通过Task Scheduler 2.0 interfaces(例如ITaskDefinition)与Windows 7任务调度程序服务进行通信。我想从ITaskDefinition的Triggers集合中提取一个特定的触发器。似乎提取特定触发器的正确​​方法是通过Item属性,这是一个索引属性。

我的第一次尝试看起来像这样:

$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对象有关,因为我认为索引属性在其他类型上运行良好。

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

2 个答案:

答案 0 :(得分:7)

项目确实有效。你必须使用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 }

答案 1 :(得分:3)

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

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