2009-11-03 13 views
7

Używam Powershell do rozmowy z usługą planowania zadań systemu Windows 7 przez COM za pomocą Task Scheduler 2.0 interfaces (np. ITaskDefinition). Chcę wyciągnąć szczególny wyzwalacz z kolekcji Triggers na ITaskDefinition. Wygląda na to, że właściwym sposobem wyodrębnienia określonego wyzwalacza jest właściwość Item, która jest właściwością indeksowaną.Jak uzyskać dostęp do właściwości indeksowanej obiektu COM z Powershell

Moja pierwsza próba wygląda mniej więcej tak:

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

Jednak ostatnia linia nie powiedzie się z tej wiadomości:

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

próbowałem kilka innych wariacji na ten temat, na przykład $triggers.Item(0), wszystko bez powodzenia. Zgaduję, że ma to związek z $trigger będąc obiektem COM, ponieważ myślę, że indeksowane właściwości działają poprawnie na innych typach.

Czy ktoś wie, jak to zrobić?

Odpowiedz

7

Przedmiot działa. Musisz użyć Item() zamiast Item [], a indeksy są oparte na 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  : 

Korzystanie wyliczający działa również jeśli nie potrzebujesz dostępu przez indeks:

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

Dzięki, to wydaje się również działać. Wciąż jednak mam nadzieję, że ktoś wie o bardziej bezpośredni sposób. – Charlie

+0

Tak, to mnie teraz dręczy. :-) –

+1

Wiesz, w tej samej notatce wydaje się działać: foreach ($ trigger in $ task.Definition.Triggers) {$ trigger} –

3

W moim systemie wygląda na to, że w przypadku niektórych zadań zwracany jest tylko jeden wyzwalacz. Możesz spróbować zmusić go do powrotu w tablicy.

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

Cool, to wydaje się dobrym obejścia. Mam nadzieję, że ktoś będzie wiedział, jak to zrobić "prawidłowo", ale to pozwoli mi teraz iść. – Charlie

+0

Niesamowite obejście. Próbowałem rzucić to na tablicę, ale całkowicie zapomniałem, że jest to właściwy sposób na zrobienie tego dla takich obiektów. Dzięki! –

Powiązane problemy