2009-11-03 9 views
7

Estoy usando Powershell para hablar con el servicio del planificador de tareas de Windows 7 a través de COM a través del Task Scheduler 2.0 interfaces (por ejemplo, ITaskDefinition). Quiero sacar un activador particular de la colección Triggers en ITaskDefinition. Parece que la forma correcta de extraer un activador en particular es a través de la propiedad Item, que es una propiedad indexada.Cómo acceder a una propiedad indexada en un objeto COM de Powershell

Mi primer intento se ve algo como esto:

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

Sin embargo, la última línea de falla con este mensaje:

Unable to index into an object of type System.__ComObject. 

He intentado algunas otras variaciones sobre este tema, por ejemplo, $triggers.Item(0), todo sin suerte. Supongo que esto tiene que ver con $trigger siendo un objeto COM, porque creo que las propiedades indexadas funcionan bien en otros tipos.

¿Alguien sabe la forma correcta de hacerlo?

Respuesta

7

El artículo no funciona. Debe usar Item() en lugar de Item [] e índices basados ​​en 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  : 

El uso de un empadronador también funciona si no es necesario acceder por el índice:

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

Gracias, esto parece funcionar también. Sin embargo, aún espero que alguien lo sepa de una manera más directa. – Charlie

+0

Sí, esto me está molestando ahora. :-) –

+1

Ya sabes, a lo largo de esta misma nota, lo siguiente parece funcionar: foreach ($ trigger en $ task.Definition.Triggers) {$ trigger} –

3

En mi sistema, parece que solo se devuelve un desencadenador para algunas tareas. Puede intentar forzarlo a regresar en una matriz.

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

fresca, esto parece una buena solución. Espero que alguien sepa cómo hacerlo "correctamente", pero esto me pondrá en marcha por el momento. – Charlie

+0

Solución impresionante. Estaba intentando lanzarlo a una matriz, pero olvidé por completo que esta es la manera correcta de hacerlo para objetos como estos. ¡Gracias! –

Cuestiones relacionadas