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

8

我正在使用PowerShell通过COM与Windows7任务计划程序服务交互,通过任务计划程序2.0接口(例如ITaskDefinition)。我想从ITaskDefinition的触发器集合中提取特定触发器。似乎正确的提取特定触发器的方法是通过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个回答

8

这个项目可以工作。您需要使用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 }

是的,这现在让我感到很烦。 :-) - Keith Hill
1
你知道,沿着同样的思路,以下代码似乎可以工作: foreach($trigger in $task.Definition.Triggers) {$trigger} - Dustin Venegas
非常好,这就是我没有仔细阅读文档的结果。感谢您努力追踪此问题。 - Charlie
1
做.NET已经很长时间了,1-based索引的问题曾经让我困扰了一段时间。感谢x0n在这个问题方面给予的帮助。 - Keith Hill
当我使用For($i=1;$i -le $projectItem.FileNames.Length; $i++) { Write-Host $projectItem.FileNames($i) }时,它可以正常工作!尽管FileNames本身不是一个集合对象,但其.Length属性存在仍很奇怪。 - Dai
显示剩余2条评论

3

在我的系统上,某些任务似乎只返回一个触发器。您可以尝试强制将其返回为数组。

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

很酷,这似乎是一个不错的解决方法。我希望有人知道如何“正确地”做,但现在这样做可以让我继续前进。 - Charlie
很棒的解决方法。我尝试将它转换为数组,但是完全忘记了这是针对这些对象的正确方法。谢谢! - Carlos Nunez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接