2013-03-15 16 views
8

Czy ktoś ma łącze lub skrypt, który używa programu PowerShell do inwentaryzacji zaplanowanych zadań na serwerze, w tym akcji?sposób korzystania z programu PowerShell do inwentaryzacji Zaplanowane zadania

Jestem w stanie uzyskać obiekt COM usługi Zaplanowane usługi i to, co nazwałbym właściwościami "najwyższego poziomu" (nazwa, stan, czas ostateczny), ale chciałbym również uzyskać informacje z części "Czynności" z Zadania harmonogramu (zasadniczo nazwa Zaplanowanego zadania i jego linia poleceń).

Na przykład:

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
foreach ($a in $t.Actions) 
{ 
    $a.Path 
} 
} 

Powyższy fragment kodu działa w zakresie wymieniające zadań; ale pętla na Akcje po prostu nie wydaje się nic robić, żadnego błędu, żadnego wyjścia.

Każda pomoc zostanie doceniona.

Odpowiedz

11

Jest to prawdopodobnie bardzo podobna do aktualnych odpowiedzi, ale napisałem krótki skrypt, aby można było. Problem z bieżącym skryptem polega na tym, że w zadaniu nie ma właściwości Actions. Musisz wyodrębnić go z definicji zadania xml, którą zapewnia obiekt comobject. Poniższy skrypt zwróci tablicę obiektów, po jednym na zaplanowane zadanie. Obejmuje akcję , jeśli akcja ma uruchomić jedno lub więcej komend. To tylko po to, abyś zaczął, więc musisz go zmodyfikować, aby zawierał więcej właściwości, jeśli ich potrzebujesz.

function getTasks($path) { 
    $out = @() 

    # Get root tasks 
    $schedule.GetFolder($path).GetTasks(0) | % { 
     $xml = [xml]$_.xml 
     $out += New-Object psobject -Property @{ 
      "Name" = $_.Name 
      "Path" = $_.Path 
      "LastRunTime" = $_.LastRunTime 
      "NextRunTime" = $_.NextRunTime 
      "Actions" = ($xml.Task.Actions.Exec | % { "$($_.Command) $($_.Arguments)" }) -join "`n" 
     } 
    } 

    # Get tasks from subfolders 
    $schedule.GetFolder($path).GetFolders(0) | % { 
     $out += getTasks($_.Path) 
    } 

    #Output 
    $out 
} 

$tasks = @() 

$schedule = New-Object -ComObject "Schedule.Service" 
$schedule.Connect() 

# Start inventory 
$tasks += getTasks("\") 

# Close com 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null 
Remove-Variable schedule 

# Output all tasks 
$tasks 

Przykł. wyjściowy:

PS > .\Untitled1.ps1 | ? { $_.Name -eq "test" } 


Actions  : notepad.exe c:\test.txt 
       calc.exe 
Path  : \test 
Name  : test 
LastRunTime : 30.12.1899 00:00:00 
NextRunTime : 17.03.2013 13:36:38 
+0

dziękuję, to pomogło niezmiernie! Chyba miałem trudności z tłumaczeniem rzeczy na Powershell (pochodzące z C# i .NET w tle) lub znajdowanie dokumentacji, która pozwala ci wiedzieć, jaki jest model obiektu dla skryptu PS. –

+3

'Get-Member' jest twoim przyjacielem podczas odkrywania nowych typów :) Ex. '$ zadań | Get-Member' dałby ci właściwości, metody itp. Dla obiektów w twojej tablicy '$ tasks'. –

1

Pobierz PowerShellPack z W7 RK i spróbować dostać-scheduledtask

http://archive.msdn.microsoft.com/PowerShellPack

Wyciąg z MSDN:

Windows 7 Resource Kit PowerShell Pakiet zawiera 10 modułów robić wszelkiego rodzaju ciekawe rzeczy z PowerShell. Moduł importu PowerShellPack faktycznie importuje 10 modułów do użycia. Oto krótki przegląd każdego z modułów.

  • WPK Tworzenie bogatych interfejsów użytkownika szybko i łatwo z Windows PowerShell. Pomyśl o HTA, ale łatwo. Ponad 600 skryptów, które pomogą Ci zbudować szybkich interfejsów
  • TaskScheduler listy zaplanowanych zadań, tworzenie lub usuwanie zadań
  • FileSystem plików monitorować i foldery, sprawdź duplikatów plików i sprawdź miejsca na dysku
  • IsePack Zoptymalizuj swoje skrypty w zintegrowanym środowisku skryptowym za pomocą ponad 35 skrótów:
  • DotNet Przeglądaj typy załadowane, znajduj polecenia, które mogą pracować z typem, i zobacz, jak możesz korzystać z PowerShell, DotNet i COM razem
  • PSImageTools konwersja, obracanie, skalowanie i przycinanie zdjęć i uzyskać metadanych obrazu
  • PSRSS Wykorzystaj Feedstore z PowerShell
  • PSSystemTools Wirtualny system operacyjny lub informacje o sprzęcie
  • PSUserTools Get użytkowników w systemie, sprawdź podniesienie i uruchom procesjaadministratora
  • PSCodeGen Generuje skrypty PowerShell, kod C# i P/Invoke
1

Innym sposobem jest skrypt, który napisałem o nazwie Get-ScheduledTask.PS1, dostępny w tym artykule:

How-To: Use PowerShell to Report on Scheduled Tasks

W ten sposób wystarczy tylko ten jeden skrypt i nie trzeba pobierać ani instalować czegokolwiek innego.

Bill

0

Wiem, że spóźniam się na imprezę, ale odpowiedź udzielona przez @Frode F., podczas gdy działa, jest technicznie nieprawidłowa.

Możesz uzyskać dostęp do elementów kolekcji Actions zaplanowanego zadania za pomocą PowerShell, po prostu nie jest to od razu oczywiste. Sam też musiałem się tego dowiedzieć.

Oto kod, aby to wszystko zrobić w PowerShell, bez konieczności syf wokół XML:

# I'm assuming that you have a scheduled task object in the variable $task: 
$taskAction = $task.Definition.Actions.Item.Invoke(1) # Collections are 1-based 

To wszystko jest do uzyskania pojedynczego elementu z kolekcji bez użycia foreach.

Ponieważ nieruchomość Actions to zbiór, który zawiera właściwość parametryczne Item (na przykład w C# byś napisać myTask.Actions[0]myTask.Actions.Item(1) lub w VB), PowerShell reprezentuje tę właściwość Item jako PSParameterizedProperty obiektu. Aby wywołać metody powiązane z tą właściwością, należy użyć metody Invoke (dla gettera) i InvokeSet (dla ustawiacza).

Pobiegłem szybki test uruchomiony kod OP i pracował dla mnie (Biegnę PowerShell 4.0, jednak, więc może to ma coś wspólnego z nim):

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
    foreach ($a in $t.Actions) 
    { 
     Write-Host "Task Action Path: $($a.Path)" # This worked 
     Write-Host "Task Action Working Dir: $($a.workingDirectory)" # This also worked 
    } 

    $firstAction = $t.Actions.Item.Invoke(1) 
    Write-Host "1st Action Path: $($firstAction.Path)" 
    Write-Host "1st Action Working Dir: $($firstAction.WorkingDirectory)" 
} 

HTH.

Powiązane problemy