Powershell Script bricht ab, wenn im Task Scheduler ausgeführt
Hey Leute,
wie der Titel schon sagt, möchte ich ein Powershell-Script über den Task-Scheduler ausführen. Das Script läuft manuell ausgeführt Fehlerfrei. Es führt einige Git-Aktionen aus und loggt den Fortschritt - im Fehlerfall wird eine E-Mail versandt.
Führe ich das Script jedoch auf einem Windows Server 2016 Datacenter im Task-Scheduler aus, bricht es ab, das Fehlerhandling funktioniert nicht mehr und vor allem auch das Loging. Ich logge eigentlich jede Consolenausgabe (normal und Fehler) die die Ausgeführten Befehle zurückgeben. Ausgeführt auf dem Datacenter wird da jedoch nichts geloggt.
Eigenartigerweise funktioniert das Script auch, wenn ich es im Task Scheduler auf meinem Heimrechner (Win10 Pro) ausführe bei gleichen Einstellungen. Das Script wird unabhängig von der Benutzeranmeldung ausgeführt.
Hier etwas Code
Das Fehlerhandling funktioniert über Exceptions (welche ausgelöst werden, wenn ein Befehl nicht mit 0 beendet). Dann wird der Fehlerfall geloggt und beendet. Eigentlich müsste dann im Task Scheduler auch stehen "beendet mit Fehlercode 0x0" oder so. Tut es aber nicht. Es ist, als ob das Exceptionhandling auf dem Datacenter nicht funktioniert.
Da es ja am naheliegend ist - nein, ein Berechtigungsproblem (git oder Directorys) liegt nicht vor.
Vlt. gibt es ja andere Sicherheitseinstellungen im Datacenter, die die Ausführung stören. Ich stehe auf dem Schlauch. Vlt. hat jemand eine Idee?
Viele Grüße,
mj
wie der Titel schon sagt, möchte ich ein Powershell-Script über den Task-Scheduler ausführen. Das Script läuft manuell ausgeführt Fehlerfrei. Es führt einige Git-Aktionen aus und loggt den Fortschritt - im Fehlerfall wird eine E-Mail versandt.
Führe ich das Script jedoch auf einem Windows Server 2016 Datacenter im Task-Scheduler aus, bricht es ab, das Fehlerhandling funktioniert nicht mehr und vor allem auch das Loging. Ich logge eigentlich jede Consolenausgabe (normal und Fehler) die die Ausgeführten Befehle zurückgeben. Ausgeführt auf dem Datacenter wird da jedoch nichts geloggt.
Eigenartigerweise funktioniert das Script auch, wenn ich es im Task Scheduler auf meinem Heimrechner (Win10 Pro) ausführe bei gleichen Einstellungen. Das Script wird unabhängig von der Benutzeranmeldung ausgeführt.
Hier etwas Code
# Hilfsfunktion zum schreiben in die Logdatei (append)
function AppendToFile
{
param([string]$content)
[switch]($silent) = $false
$content | Out-File -FilePath $logFile -Append
if ($silent -eq $false)
{
Write-Output $content
}
}
# Hilfsfunktion um ein Commando auszuführen, das Ergebnis zu loggen und im Fehlerfall eine Exception zu werfen
function ExcecuteThrow($command)
{
# param
AppendToFile -content ("Execute: " + $command)
Invoke-Expression $command -OutVariable exret -ErrorVariable errret
if ($LastExitCode -ne 0)
{
#There was an Error -> throw
throw ("Failed: " + $errret)
} else
{
AppendToFile -content $exret
}
}
try
{
# Header der Logdatei schreiben
AppendToFile -content $headerMsg
# ursprünglichen Pfad merken
$oldLocation = Get-Location
# ins Verzeichnis des LIVE-Systems gehen (Mergequelle)
Set-Location $repopathlive
# Git-status feststellen und loggen
ExcecuteThrow "git status"
# Falls bereits Dateien für einen commit gestanged wurden, unstage
ExcecuteThrow "git reset ."
# ...
# ...
} catch
{
# Fehlerfall loggen und mail senden
AppendToFile -content $_
SendEMail $_
AppendToFile -content "Terminating"
} finally
{
# ...
}
Das Fehlerhandling funktioniert über Exceptions (welche ausgelöst werden, wenn ein Befehl nicht mit 0 beendet). Dann wird der Fehlerfall geloggt und beendet. Eigentlich müsste dann im Task Scheduler auch stehen "beendet mit Fehlercode 0x0" oder so. Tut es aber nicht. Es ist, als ob das Exceptionhandling auf dem Datacenter nicht funktioniert.
Da es ja am naheliegend ist - nein, ein Berechtigungsproblem (git oder Directorys) liegt nicht vor.
Vlt. gibt es ja andere Sicherheitseinstellungen im Datacenter, die die Ausführung stören. Ich stehe auf dem Schlauch. Vlt. hat jemand eine Idee?
Viele Grüße,
mj
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4799290841
Url: https://administrator.de/forum/powershell-script-bricht-ab-wenn-im-task-scheduler-ausgefuehrt-4799290841.html
Ausgedruckt am: 27.03.2025 um 08:03 Uhr
11 Kommentare
Neuester Kommentar
Beispiel
Da haben wir noch ein paar "Schrauben" zum drehen. Benutzer? Nur wenn angemeldet? Höchste Privilegien?
Nicht immer macht alles Sinn. Poste mal deine Scheduler Maske und die vom Server wo es final laufen soll. Normal sollte es sich bei gleicher PS Version ähnlich verhalten. Aber zeig mal was du auf den beiden im Task hinterlegt hast.
Da haben wir noch ein paar "Schrauben" zum drehen. Benutzer? Nur wenn angemeldet? Höchste Privilegien?
Nicht immer macht alles Sinn. Poste mal deine Scheduler Maske und die vom Server wo es final laufen soll. Normal sollte es sich bei gleicher PS Version ähnlich verhalten. Aber zeig mal was du auf den beiden im Task hinterlegt hast.
Kommt da zuviel rüber? Typconversion etc.? Hab meine immer so ähnlich gemacht wie hier:
$_ Objekt bietet ja mehr. Hab in Message und ItemName getrennt. Zumindest nur die Message solte ja reichen.
Ok mit $_.Exception.Message oder $($_.Exception.Message) sollte es auch ohne die Var gehen.
$_ Objekt bietet ja mehr. Hab in Message und ItemName getrennt. Zumindest nur die Message solte ja reichen.
} catch {
$ErrorMessage = $_.Exception.Message
$FailedItem = $_.Exception.ItemName
"$(Get-Date) - Firewall Deaktivieren $ErrorMessage Item: $FailedItem" | Out-File -FilePath "C:\temp\startup-log.txt" -Append -Force
}
Ok mit $_.Exception.Message oder $($_.Exception.Message) sollte es auch ohne die Var gehen.
Zitat von @emjot42:
Letztlich liegt das Problem darin, dass der Catch-Block nicht korrekt ausgeführt zu werden scheint und somit das Errorhandling nicht greift.
Letztlich liegt das Problem darin, dass der Catch-Block nicht korrekt ausgeführt zu werden scheint und somit das Errorhandling nicht greift.
Für kopieren etc. hab ich es oft in die Folgezeile so geschrieben und gelöst:
Remove-Item "C:\TEMP\backup\db\*" -Recurse -Force -ErrorAction SilentlyContinue
if(-not $?) { $Script:MOVEErrorMsg += "`r`n`r`nRemove c:\temp\... Failed: " + $error.exception.message }
if(-not $?) Fängt hier Fehler ab. Umbrüche nur, damit es im Ticket System schöne aussieht.
https://stackoverflow.com/questions/38419325/catching-full-exception-mes ...
Das sollte die Lücken schließen. Das Objekt was zurück kommt ist nicht immer das selbe. Je nachdem wo wir uns bewegen...
Das sollte die Lücken schließen. Das Objekt was zurück kommt ist nicht immer das selbe. Je nachdem wo wir uns bewegen...
Alles gut. Nur ein Versuch. Schwierig wenn man nicht davor sitzt.
PowerShell Version, Alias kann man ja auch alles anpassen, wenn man möchte. Aber denke mal am PS Profil in den tiefen des Systems hast du wohl kaum rumgedreht.
Pauschal fällt einen bei Servern + PS + externe Dienste noch SSL ein. Aber dann müsste das ein generelles Problem sein. Oder es muss ggf. ja der Internet Explorer/ Edge einmal "aktiviert" sein. Meine die Fragenkataloge beim erseten Aufruf. Sonst lässt es sich nichit steuern. Progamme die die Module nutzen greifen ins leere.
Aber auch hier würde man das in der GUI auch sehen. Bin ratlos. Hatten hier vor ein paar Tagen wen, der unter den richtigen Account alles ausgeführt hat. Nach ein paar Tagen kam er zu dem Schluß, dass er sich immer beim User vertan hat.
Mitunter ist man ja Betriebsblind. Die groben Fehler sind ja meist:
- fehlende Aktivierugn vin IE bei Webrequest
- SSL Handling
- Berechtigungsproblem.
- PS 2 statt PS 5.x (Windows 7 vs Windows 10 z.B.) - Pipen u.ä. verhält sich da oft auch anders.
Außer "Hallo Welt" und testen fällt mir nichts ein ....
PowerShell Version, Alias kann man ja auch alles anpassen, wenn man möchte. Aber denke mal am PS Profil in den tiefen des Systems hast du wohl kaum rumgedreht.
Pauschal fällt einen bei Servern + PS + externe Dienste noch SSL ein. Aber dann müsste das ein generelles Problem sein. Oder es muss ggf. ja der Internet Explorer/ Edge einmal "aktiviert" sein. Meine die Fragenkataloge beim erseten Aufruf. Sonst lässt es sich nichit steuern. Progamme die die Module nutzen greifen ins leere.
Aber auch hier würde man das in der GUI auch sehen. Bin ratlos. Hatten hier vor ein paar Tagen wen, der unter den richtigen Account alles ausgeführt hat. Nach ein paar Tagen kam er zu dem Schluß, dass er sich immer beim User vertan hat.
Mitunter ist man ja Betriebsblind. Die groben Fehler sind ja meist:
- fehlende Aktivierugn vin IE bei Webrequest
- SSL Handling
- Berechtigungsproblem.
- PS 2 statt PS 5.x (Windows 7 vs Windows 10 z.B.) - Pipen u.ä. verhält sich da oft auch anders.
Außer "Hallo Welt" und testen fällt mir nichts ein ....