Wie drucke ich Informationen über den Taskplaner in einem Powershell-Skript aus?


8

Ich versuche, Informationen vom Task Schedulerlokalen Computer in einem PowerShellSkript auszudrucken, damit andere Benutzer diese Informationen ebenfalls ausdrucken können und nicht auf die zugreifen müssen Task Scheduler. Ich brauche das Skript zum Ausdrucken

  • Name,
  • Status,
  • löst aus,
  • nächste Laufzeit,
  • letzte Laufzeit,
  • letztes Laufergebnis,
  • Autor,
  • erstellt.

Ich kann die Informationen über den Namen, die nächste Laufzeit und die letzte Laufzeit ausdrucken, aber der Rest wird nicht gedruckt, wenn ich das Skript ausführe.

Ich habe bereits einen kleinen Anfang mit meinem Skript gemacht und die Felder heruntergefahren.

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

$tasks | select Name,Status,Triggers,NextRunTime,LastRunTime,LastRunResult,Author,Created | ft

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

Jede Hilfe oder Anregungen wäre dankbar.

Unten ist ein Screenshot mit dem, wonach ich suche und welche Felder keine Daten ausdrucken:

Unten ist ein Screenshot mit dem, wonach ich suche und welche Felder keine Daten ausdrucken:


1
Es ist leer, weil es im Objekt nicht verfügbar ist. Wenn du rennst, $Tasks | Get-Memberwas bekommst du?
MDMoore313

1
Schau dir an, was $tasksenthält. Es werden nicht alle haben , dass Sie ausgeben wollen: Name, Path, State, Enabled, LastRunTime, LastTaskResult, NumberOfMissedRuns, NextRunTime, Definition, Xml.
Slybloty

Ich habe meine Antwort aktualisiert. Haben Sie noch nicht das, was Sie brauchen?
MDMoore313

Ich sehe jetzt mit dem Befehl get-members. Ich wusste nicht, dass ich nicht die spezifischen Felder aufrufe, in denen ich nach Daten gesucht habe. Ich bin neu in Powershell-Skripten und dachte, es sei ein vorbestimmtes Feld, das ich nur aufrufen musste. Also mit dem Befehl get-member, damit ich den Autor abrufen kann, erstellt und was auch immer ich sonst noch brauche ... muss ich diese in meiner Variablen $ task angeben?
user38725

Mit "denen" meine ich zum Beispiel: Ich brauche Trigger, also mache ich a: get.Triggers um die Trigger für diese Aufgabe zu ziehen?
user38725

Antworten:


5

Dies könnte ein wenig bereinigt werden (dh LastRunResult-Codes zuordnen). Lass es mich wissen falls du Hilfe benötigst. Trigger sind etwas schwieriger, da ich nicht glaube, dass die einfache englische Darstellung, die Sie beim Anzeigen einer Aufgabe in der GUI sehen, im COM-Objekt vorhanden ist. Ich glaube, es müsste aus dem TriggerCollectioneingelagerten gebaut werdenRegisteredTask.Definition.Triggers

$sched = New-Object -Com "Schedule.Service"
$sched.Connect()
$out = @()
$sched.GetFolder("\").GetTasks(0) | % {
    $xml = [xml]$_.xml
    $out += New-Object psobject -Property @{
        "Name" = $_.Name
        "Status" = switch($_.State) {0 {"Unknown"} 1 {"Disabled"} 2 {"Queued"} 3 {"Ready"} 4 {"Running"}}
        "NextRunTime" = $_.NextRunTime
        "LastRunTime" = $_.LastRunTime
        "LastRunResult" = $_.LastTaskResult
        "Author" = $xml.Task.Principals.Principal.UserId
        "Created" = $xml.Task.RegistrationInfo.Date
    }
}

$out | fl Name,Status,NextRuNTime,LastRunTime,LastRunResult,Author,Created

Dies hat genau das getan, was ich brauchte, nur mit der Ausnahme, dass Trigger nicht aufgerufen werden, aber ich kann das noch etwas recherchieren und etwas darüber finden. Vielen Dank!
user38725

1
Wie verwende ich dies, um eine Remoteverbindung mit einem anderen Server herzustellen? (Ich bin immer noch in der gleichen Domain) Verwenden Sie den Aufrufbefehl?
user38725

3
Sicher,invoke-command -ComputerName REMOTEPC -ScriptBlock { --Paste Entire Script Block Here-- }
pk.

Ich habe unter "Status" Folgendes hinzugefügt: "Actions" = ($ xml.Task.Actions.Exec |% {"$ ($ _. Command) $ ($ _. Arguments)"}) -join "` n "In Wie zeige ich in der $ out-Anweisung nur die Aktionen an, die nicht leer sind?
Jeremy F.

Sie könnten so etwas wie foreach ($o in $out) {$o.PSObject.Properties | ?{$_.Value -ne $null} | ft Name,Value}nur Eigenschaften auflisten, die nicht null sind. Die Ausgabe sieht ein bisschen funky aus, sollte aber funktionieren.
pk.

5

Server 2012 R2 und Windows 8.1 verfügen über Taskplaner-Cmdlets. Dieses Modul kann kopiert und auf einem Windows 7-Computer verwendet werden. Vermutlich benötigt es auch das neueste .NET und das Windows Management Framework. Ich kann geplante Aufgaben deaktivieren und wieder aktivieren sowie Aufgabeninformationen anzeigen. Derzeit sind mir keine integrierten Cmdlets bekannt, die mir diese Informationen geben oder dieses Steuerelement zulassen.

So listen Sie alle geplanten Aufgaben auf dem Computer auf:

Get-ScheduledTask

Sie können die folgenden Mitglieder aus dem Tasksequenzobjekt abrufen:

PS C:\BigHomie> $A = Get-ScheduledTask | select -First 1

PS C:\BigHomie> $A

       TypeName: Microsoft.Management.Infrastructure.CimInstance#Root/Microsoft/Windows/TaskScheduler/MSFT_ScheduledTask

Name                      MemberType     Definition
----                      ----------     ----------
Clone                     Method         System.Object ICloneable.Clone()
Dispose                   Method         void Dispose(), void IDisposable.Dispose()
Equals                    Method         bool Equals(System.Object obj)
GetCimSessionComputerName Method         string GetCimSessionComputerName()
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()
GetHashCode               Method         int GetHashCode()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, Sys...
GetType                   Method         type GetType()
ToString                  Method         string ToString()
Actions                   Property       CimInstance#InstanceArray Actions {get;set;}
Author                    Property       string Author {get;set;}
Date                      Property       string Date {get;set;}
Description               Property       string Description {get;set;}
Documentation             Property       string Documentation {get;set;}
Principal                 Property       CimInstance#Instance Principal {get;set;}
PSComputerName            Property       string PSComputerName {get;}
SecurityDescriptor        Property       string SecurityDescriptor {get;set;}
Settings                  Property       CimInstance#Instance Settings {get;set;}
Source                    Property       string Source {get;set;}
TaskName                  Property       string TaskName {get;}
TaskPath                  Property       string TaskPath {get;}
Triggers                  Property       CimInstance#InstanceArray Triggers {get;set;}
URI                       Property       string URI {get;}
Version                   Property       string Version {get;set;}
State                     ScriptProperty System.Object State {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes...


PS C:\BigHomie> $A.Triggers


Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 :
Repetition         : MSFT_TaskRepetitionPattern
StartBoundary      :
PSComputerName     :

Vielen Dank für Ihre Antwort, aber ich beschäftige mich mehr mit dem Dienst "Task Scheduler" und den aktuellen Aufgaben, die im Dienst "Task Scheduler" enthalten sind. Ich werde in Kürze einen Screenshot hinzufügen, um zu zeigen, bei was ich Hilfe brauche!
user38725

Jimmyboy, wie ist das anders als das, was ich dir gegeben habe?
MDMoore313

Verwenden Sie bestimmte Module, die nicht standardmäßig ausgeführt werden?
Slybloty

1
Der Grund, den ich frage, ist, dass ich es auf 2012R2 ausgeführt habe und es sich völlig anders verhält als das, was Sie in Ihrem Beitrag dargestellt haben.
Slybloty

1
@slybloty yugh, was ich benutze, ist eigentlich ein separates Modul von vor W8 Tagen . Nun, das ist peinlich, aber genau das passiert, wenn Sie ein Projekt für einige Monate verlassen und es abholen, weil jemand eine Frage zu SF gestellt hat;) Ich werde diese Antwort bearbeiten, aber die gute Nachricht ist das 2k12-Modul gibt weitere Informationen und der -RecurseParameter wird nicht benötigt. OP Sollte dies idealerweise verwenden, anstatt das Rad neu zu erfinden.
MDMoore313
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.