Windows Server 2012 R2 Aufgabenplanung: Aufgaben nacheinander auführen?

websurferin83

Lieutenant
Registriert
Aug. 2011
Beiträge
869
Hallo zusammen,

ich habe gerade eine Problem, bei dem ich nicht weiterkomme.

Folgendes Ausgangsszenario ist vorhanden:
Ein externes USB-Laufwerk wird zu einem bestimmten Zeitpunkt mit einer Art Zeitschaltuhr eingeschaltet (es ist mit einem USB-Kabel dauerhaft mit dem Server verbunden). In der "Windows Server Sicherung" wurde ein regelmäßiger inkrementeller Backup-Auftrag angelegt, welcher einige Minuten nach Einschalten des USB-Laufwerks beginnt.

Nun soll das Laufwerk nach Ende des Backup-Vorgangs "sauber getrennt" werden, bevor die Zeitschaltuhr die Stromzufuhr unterbricht.

Um das USB-Laufwerk sauber per Batch zu trennen gibt es ein kleines aber feines Tool:
http://www.heise.de/ct/hotline/Und-tschuess-per-Batch-315568.html

Das Problem:
Die Batch-Datei, in der ich den Befehl zum Trennen des USB-Geräts "verpacke", soll erst dann ausgeführt werden, wenn der Backup-Auftrag korrekt in der Windows-Aufgabenplanung beendet wurde.

Hat jemand eine Idee, wie sich das realisieren lässt, ohne einen riesengroßen Aufwand zu treiben? Die Nutzung von wbadmin in der Batch-Datei ist leider keine Alternative zur GUI, da über Kommandozeile leider keine inkrementellen Backups möglich sind.

Ich würde mich wirklich sehr freuen, wenn jemand eine Anleitung oder einen Link posten könnte, wie ich das realisieren könnte.

Viele Grüße und herzlichen Dank
websurfer83.
 
Hast du probiert, der Aufgabe, die das Backup ausführt, einfach die Batch-Datei als zweite Aktion mitzugeben? Wenn ich mich recht entsinne, hatte ich mal das Problem, dass eine zweite Aktion erst angestoßen wurde, nachdem die erste beendet wurde. Das wäre ja dann genau das, was du suchst.

Ich kann mich aber auch irren, weil das bereits eine Weile her ist, aber einen Versuch wäre es mir wert.
 
Realisiere das ganze doch über Powershell.
Die Aufgabe der Windows Server Sicherung per PS1 durchführen und anschliessend die Batch ausführen.
 
Bau doch einen neuen Task der die erfolgreiche Sicherung als Trigger nimmt um zu starten.
 
crashbandicot schrieb:
Bau doch einen neuen Task der die erfolgreiche Sicherung als Trigger nimmt um zu starten.

Genau so habe ich mir das vorgestellt. Aber wie genau wird das als Trigger gemacht? Kannst du mir dazu bitte mehr Hilfestellung geben?
 
Function Get-SchedTasks {
<#
.SYNOPSIS

This function will display the status of Scheduled Task in the Root Folder (Not Recursive).

.DESCRIPTION

This function will display the status of Scheduled Task in the Root Folder (Not Recursive). The function uses the
Schedule.Service COM Object to query information about the scheduled task running on a local or remote computer.

.PARAMETER ComputerName

A single Computer or an array of computer names. The default is localhost ($env:COMPUTERNAME).

.EXAMPLE

Get-SchedTasks -ComputerName Server01

This example will query any scheduled task, located in Root Task Folder, of Server01.

.LINK

This Function is based on information from:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa446865(v=vs.85).aspx

.NOTES

Author: Brian Wilhite
Email: bwilhite1@carolina.rr.com
Date: 02/22/2012
#>

[CmdletBinding()]
param(
[parameter(Position=0,ValueFromPipeline=$true)]
[alias("CN","Computer")]
[String[]]$ComputerName="$env:COMPUTERNAME"
)

Begin
{
#Adjusting ErrorActionPreference to stop on all errors
$TempErrAct = $ErrorActionPreference
$ErrorActionPreference = "Stop"
#Defining Schedule.Service Variable
$SchedService = New-Object -ComObject Schedule.Service
}#End Begin Script Block

Process
{
Foreach ($Computer in $ComputerName)
{
$Computer = $Computer.Trim().ToUpper()
Try
{
#Connecting to the Schedule.Service COM Object on $Computer"
$SchedService.Connect($Computer)
$TaskFolder = $SchedService.GetFolder("")
$RootTasks = $TaskFolder.GetTasks("")
Foreach ($Task in $RootTasks)
{
Switch ($Task.State)
{
0 {$Status = "Unknown"}
1 {$Status = "Disabled"}
2 {$Status = "Queued"}
3 {$Status = "Ready"}
4 {$Status = "Running"}
}#End Switch ($Task.State)
$Xml = $Task.Xml
#The code below parses the Xml String Data for the "RunAs User" that is returned from the Schedule.Service COM Object
[String]$RunUser = $Xml[(($Xml.LastIndexOf("<UserId>"))+8)..(($Xml.LastIndexOf("</UserId>"))-1)]
$RunUser = $RunUser.Replace(" ","").ToUpper()
$Result = New-Object PSObject -Property @{
ServerName=$Computer
TaskName=$Task.Name
RunAs=$RunUser
Enabled=$Task.Enabled
Status=$Status
LastRunTime=$Task.LastRunTime
Result=$Task.LastTaskResult
NextRunTime=$Task.NextRunTime
}#End $Result = New-Object
$Result = $Result | Select-Object Servername, TaskName, RunAs, Enabled, Status, LastRunTime, Result, NextRunTime
$Result
}#End Foreach ($Task in $RootTasks)
}#End Try
Catch
{
$Error[0].Exception.Message
}#End Catch
}#End Foreach ($Computer in $ComputerName)
}#End Process Script Block
End
{
#Resetting ErrorActionPref
$ErrorActionPreference = $TempErrAct
}#End End Script Block
}

$TimeOfDay = Get-Date
$TimeOfDay = $TimeOfDay.DateTime
$LastRunTime = Get-SchedTasks -ComputerName "ComputerName" | Where TaskName -EQ "TaskName" | Select LastRunTime
$LastRunTime = $LastRunTime.LastRunTime.DateTime

Hiermit erhälst du in den Variablen $TimeofDay die aktuelle Systemzeit und mit $LastRunTime, die Zeit, wo das Script zuletzt gelaufen ist.
Wenn die aktuelle Zeit "vor" der LastRunTime liegt, dann kannst du dein Batch zum sauber trennen ausführen..
 
Hallo,

danke für die Antwort. Ich habe inzwischen auch eine Lösung gefunden:
Als Trigger lässt sich "Bei einem Ereignis" auswählen. Dort habe ich den Pfad zum Windows-Backup in der Ereignisanzeige angegeben und die ID "14" (= Sicherung abgeschlossen).

Eine Anleitung (wenn auch mit einem anderen Szenario) gibt es auch:
http://www.heise.de/ct/hotline/Gleich-nach-dem-Aufstehen-991543.html

Ich werde testen, ob das so klappt, wie es soll.

Viele Grüße
websurfer83.
 
websurfer83 schrieb:
Als Trigger lässt sich "Bei einem Ereignis" auswählen. Dort habe ich den Pfad zum Windows-Backup in der Ereignisanzeige angegeben und die ID "14" (= Sicherung abgeschlossen).

Genau so meinte ich es. ;)
 
Zurück
Oben