none
Powershell führt Script unter Windows 7 und Aufgabenplaner nicht richtig aus RRS feed

  • Allgemeine Diskussion

  • Hallo,

    ich habe ein Script erstellt, was folgende macht:

    1. Es wird ein Batch-Script aufgerufen, was Dateien erstellt
    2. Diese Dateien werden nach und nach auf einen FTP-Server hochgeladen
    3. Danach werden die Dateien lokal, nicht auf dem FTP-Server in einen bestimmten Ordner gesichert
    4. Die Dateien werden lokal aus dem Ordner, wohin sie erstellt worden sind gelöscht
    5. Es wird eine Mail mit der Anzahl, der gesicherten Dateien versendet 

    Führe ich dies im Kontext von einem bestimmten User aus funktioniert es ohne Probleme. Die einzelnen Schritte werden abgearbeitet. Sobald ich das Script über den Aufgabenplaner ausführen lasse, wird folgendes gemacht:

    1. Das Batch-Script wird aufgerufen und die Dateien erstellt
    2. Die Dateien werden NICHT hochgeladen (Es taucht kein Fehler auf, obwohl ich im try-catch-Block Fehler abfangen lasse.)
    3. Die Dateien werden nicht verschoben
    4. Die Dateien werden gelöscht
    5. Eine Mail wird rausgeschickt, aber die Anzahl der zu gesicherten Dateien wird nicht mitgeliefert. 

    Ich habe schon viele probiert. Leider hänge ich an dem Problem schon einige Stunden.
    Ich benutze Windows 7 mit aktuellen Patchstand. Der Rechner ist in einer Domäne.
    Wie oben schon geschrieben, rufe ich das Script mit einem bestimmten Benutzer von Hand auf, geht es. Wird ein Task erstellt und das Script soll in dessen Kontext ausgeführt werden, wird dies gemacht, aber mit den beschrieben Fehlern.

    Kann mir einer sagen, an was das liegen kann?

    Danke im voraus,

    Rob



    Donnerstag, 13. Oktober 2016 10:58

Alle Antworten

  • Rob,

    es wäre vermutlich hilfreich, das Script zu sehen. Allein mit der Beschreibung wird der Fehler wohl nicht richtig einzugrenzen sein.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 13. Oktober 2016 12:00
  • Wie gefordert, hier das Script:

    # Erstellen der Dateien
    cmd.exe /c "C:\Pfad\Script.cmd"
    
    ## Festlegen von Variablen
    # Auslesen des Ordners
    $Files = Get-ChildItem ".\Zu_Schreibender_Ordner"
    # Festlegen der FTP-Adresse
    $FTPAdress = "ftp://FTP-Adresse/"
    # Name des FTP Benutzers
    $FTPUser = "FTP-User"
    # Passwort des FTP Benutzers
    $FTPPass = "FTP-Passwort"
    #Abfragen des Datums im Format Jahr-Monat-Tag
    $Date = Get-Date -Format yyyy-MM-dd
    # BackupVariable für den Ordner
    $BackupDate = "Backup-$Date"
    # Fehlervariable für Mailverkehr
    $ErrorFile = 0
    # SMTP-Server für Mailverkehr
    $MailSMTPServer = "SMTP-Server"
    # Empfängeradressen
    $MailTo = "Mail1@empfänger.de", "Mail2@empfänger.de"
    # Absenderadresse
    $MailFrom = "Mail@absender.de"
    # Betreff der Mail
    $MailSubject = "Betreff der Mail"
    $utf8 = New-Object System.Text.utf8encoding
    # Ordner Logs überprüfen und testen
    if (Test-Path ".\Logs") {
    	# Alles ok	
    } else {
    	New-Item -Path "." -Name "Logs" -ItemType Directory | Out-Null
    }
    
    if (Test-Path ".\Backup") {
    	# Alles ok	
    } else {
    	New-Item -Path "." -Name "Backup" -ItemType Directory | Out-Null
    }
    
    if (Test-Path ".\Backup\$BackupDate") {
    	# Alles ok
    } else {
    	New-Item -Path ".\Backup" -Name "$BackupDate" -ItemType Directory | Out-Null
    }
    
    # Erstellen eines internen Webclient
    $webclient = New-Object System.Net.WebClient
    
    # Festlegen der Logindaten für den Webclient
    $webclient.Credentials = New-Object System.Net.NetworkCredential($FTPUser,$FTPPass)
    
    # Überprüfen, ob Ordner exisitiert
    if (Test-Path $Files) {
    	# Überprüfen, ob Ordner nicht leer ist
    	if ($Files -ne $null) {
    		# Jede Datei wird einzeln hochgeladen
    		foreach ($File in $Files) {
    			
    			# Abfangen, ob die Dateien auch hochgeladen werden
    			try {
    				# Ausgabe 
    				Write-Host -ForegroundColor Yellow "Lade Datei $File hoch"
    				# Festlegen der Zieladresse mit Dateinamen
    				$uri = New-Object System.Uri($FTPAdress + $File.Name)
    				# Datei hochladen
    				$webclient.UploadFile($uri, $File.FullName)
    				$ErrorFile = 0
    			} catch {
    				# Ausgabe in ErrorFile Datei nicht hochgeladen wurde
    				Add-Content -Path ".\Error-$Date.txt" "Datei $File wurde nicht hochgeladen"
    			}
    		}
    	} else {
    		# Ausgabe in ErrorFile das Ordner leer ist
    		Add-Content -Path ".\Logs\Error-$Date.txt" "Ordner ist leer"
    		$ErrorFile = 1
    	}
    } else {
    	# Ausgabe in ErrorFile das Ordner nicht exisitiert
    	Add-Content -Path ".\Logs\Error-$Date.txt" "Ordner exisitiert nicht"
    	$ErrorFile = 2
    }
    
    # Kopieren der Dateien in das vorgegebene Backupverzeichnis
    Copy-Item -Path ".\Zu_Schreibender_Ordner\*.*" -Destination ".\Backup\$BackupDate" -Recurse
    
    
    if ($ErrorFile -eq 0) {
    	# Auslesen der Dateien im Backupordner
    	$FilesBackup = Get-ChildItem ".\Backup\$BackupDate" -Recurse
    	# Zählen der Dateien
    	$FilesCount = $FilesBackup.Count
    	# Versenden der Mail
    	Send-MailMessage -SmtpServer $MailSMTPServer -To $MailTo -From $MailFrom -Subject $MailSubject -Body "Heute wurden $FilesCount gesichert.`nDer Ordner in den die Dateien gesichert wurden heißt $BackupDate.`n`nDas BackupScript" -encoding $utf8
        ## Löschen der Elemente due gesichert wurden
        Get-ChildItem $Files -Recurse | Remove-Item -Force
    } elseif ($ErrorFile -eq 1) {
    	# Versenden der Mail
    	Send-MailMessage -SmtpServer $MailSMTPServer -To $MailTo -From $MailFrom -Subject $MailSubject -Body "Heute kein Backup, da der Ordner leer war.`n`nDas BackupScript" -Encoding $utf8
    } elseif ($ErrorFile -eq 2) {
    	# Versenden der Mail
    	Send-MailMessage -SmtpServer $MailSMTPServer -To $MailTo -From $MailFrom -Subject $MailSubject -Body "Fehler im Dateisystem.`nOrdner exisitert nicht.`n`nDas BackupScript" -Encoding $utf8
    } else {
    	# Versenden der Mail
    	Send-MailMessage -SmtpServer $MailSMTPServer -To $MailTo -From $MailFrom -Subject $MailSubject -Body "Variable ErrorFile ist Unbekannt. Der aktuelle Wert ist $ErrorFile.`nBitte heute alles nochmal überprüfen.`n`nDas BackupScript" -Encoding $utf8
    }

    Donnerstag, 13. Oktober 2016 12:20
  • Hallo Rob,

    du verwendest viele relative Pfade. Hast du in der Aufgabenplanung den korrekten Ausführungsordner ("Starten in") angegeben?

    Grüße,
    Friedrich


    There's no place like 127.0.0.1

    Donnerstag, 13. Oktober 2016 13:17
  • Hört sich eigentlich sehr nach einem Rechteproblem an. Du hast im Task den selben User als ausführenden Account eingetragen, mit dem du den erfolgreichen Test absolviert hast?

    Exportiere doch mal den Task als XML und poste die hier.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Freitag, 14. Oktober 2016 14:06
    Moderator
  • Ich habe die Powershell auch im Kontext von dem Benutzer geöffnet, der auch den Task im TaskPlaner ausführt und da ging es ohne Probleme.
    Montag, 17. Oktober 2016 05:55
  • Exportiere doch mal den Task als XML und poste die hier.


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Dienstag, 18. Oktober 2016 23:02
    Moderator