Batch wird nicht über Scheduler gestartet
Hallo,
ich weiß, diese Frage wurde hier schon mehrfach gestellt, aber nie richtig gelöst bzw. beantwortet.
Ich habe ein Batch geschrieben, das wenn ich es in der cmd starte einwandfrei läuft. Wenn ich das über die Aufgabenplanung starte dann steht zwar am Ende das es erfolgreich ausgeführt wurde, aber mit einem Returncode 255. Das Batch wurde auch definitiv nicht abgearbeitet. Das kann ich an Variablen sehen, die gesetzt werden müssten (vom Batch) aber nicht sind.
Hier mal das Batch:
Hier kann man sehen, das die Variablen leer sind nach Ablauf des Batch:
Hier die Ausgabe aus der Aufgabenplanung:
Das Batch wird mit meinem Account ausgeführt (Admin) auch die Rechte für die Stapelverarbeitung hat mein Account. Ein zweites Batch läuft völlig fehlerfrei durch. Auch dieses habe ich selber geschrieben. Das macht in der Aufgabenplanung keine Schwierigkeiten.
Das Batch liegt direkt im C:\ und ausführen Rechte hat jeder.
Ich weiß leider nicht mehr wo ich noch suchen soll. Vielleicht findet ja jemand von Euch sofort einen Fehler den ich vor lauter suchen überhaupt nicht mehr sehe.
Es handelt sich um einen Win 2008 R2 Server.
Ich danke für jede Hilfestellung schon mal im voraus.
Gruß Oli
ich weiß, diese Frage wurde hier schon mehrfach gestellt, aber nie richtig gelöst bzw. beantwortet.
Ich habe ein Batch geschrieben, das wenn ich es in der cmd starte einwandfrei läuft. Wenn ich das über die Aufgabenplanung starte dann steht zwar am Ende das es erfolgreich ausgeführt wurde, aber mit einem Returncode 255. Das Batch wurde auch definitiv nicht abgearbeitet. Das kann ich an Variablen sehen, die gesetzt werden müssten (vom Batch) aber nicht sind.
Hier mal das Batch:
@ echo off
set groesse=%check3:~0,30%
for %%F in (%groesse%) do set size=%%~zF
echo %size%
if %size% leq 79999999 goto kleiner
if %size% geq 80000000 goto groesser
:kleiner
set serrcd=2
set sergebnis=ACHTUNG Die Datei ist kleiner als 80 MB
goto senden
:groesser
set serrcd=0
set sergebnis=Die Datei ist groesser als 80 MB
goto senden
:senden
set host=xxx.xxx.xxx
set sservice=Backup_Groesse
set stest=%host% %sservice% %serrcd% %sergebnis%
echo %stest% >C:\sergebnis.txt
cd c:\send_nsca_win32_src\send_nsca\bin\
send_nsca.exe -H XXX -p 5667 -c C:\send_nsca_win32_src\send_nsca\bin\send_nsca.cfg <C:\sergebnis.txt
Hier kann man sehen, das die Variablen leer sind nach Ablauf des Batch:
C:\>echo %groesse% %serrcd% %size%
%groesse% %serrcd% %size%
Hier die Ausgabe aus der Aufgabenplanung:
Die Aufgabenplanung hat die Aufgabe "\Filolos_Backup_Groesse", Instanz "{174cdff3-cddf-4f8c-b654-36da1b6e3459}", Aktion "C:\Windows\SYSTEM32\cmd.exe" mit Rückgabecode 255 erfolgreich abgeschlossen.
Das Batch wird mit meinem Account ausgeführt (Admin) auch die Rechte für die Stapelverarbeitung hat mein Account. Ein zweites Batch läuft völlig fehlerfrei durch. Auch dieses habe ich selber geschrieben. Das macht in der Aufgabenplanung keine Schwierigkeiten.
Das Batch liegt direkt im C:\ und ausführen Rechte hat jeder.
Ich weiß leider nicht mehr wo ich noch suchen soll. Vielleicht findet ja jemand von Euch sofort einen Fehler den ich vor lauter suchen überhaupt nicht mehr sehe.
Es handelt sich um einen Win 2008 R2 Server.
Ich danke für jede Hilfestellung schon mal im voraus.
Gruß Oli
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 170097
Url: https://administrator.de/contentid/170097
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
20 Kommentare
Neuester Kommentar
Hallo Oli,
Du kannst nicht erwarten, dass das Batchfile Variablen setzt und Du die dann außerhalb des Batchfiles zur Verfügung hast. Die Variablen existieren nur solange das Batchfile läuft. Wenn Du die Werte nachher brauchst, musst Du sie innerhalb des Batchfiles in eine Datei schreiben, die Du später ausließt.
Gruß
Friemler
Du kannst nicht erwarten, dass das Batchfile Variablen setzt und Du die dann außerhalb des Batchfiles zur Verfügung hast. Die Variablen existieren nur solange das Batchfile läuft. Wenn Du die Werte nachher brauchst, musst Du sie innerhalb des Batchfiles in eine Datei schreiben, die Du später ausließt.
Gruß
Friemler
Hallo Oli,
bei mir funktioniert sowas nicht, habe gerade einen Test durchgeführt. Ich wüsste auch nicht, wie das gehen sollte (außer mit Zusatztools). Die Batch wird von einem CMD-Prozess ausgeführt, der die Umgebungsvariablen seines Elternprozesses erbt. Dieses geerbte Environment wird von der Batch verändert. Wenn der ausführende CMD-Prozess beendet wird, ist auch das veränderte Environment Geschichte.
Gruß
Friemler
bei mir funktioniert sowas nicht, habe gerade einen Test durchgeführt. Ich wüsste auch nicht, wie das gehen sollte (außer mit Zusatztools). Die Batch wird von einem CMD-Prozess ausgeführt, der die Umgebungsvariablen seines Elternprozesses erbt. Dieses geerbte Environment wird von der Batch verändert. Wenn der ausführende CMD-Prozess beendet wird, ist auch das veränderte Environment Geschichte.
Gruß
Friemler
Moin,
Mach mir kein X für ein U vor...
Apropos X, SETx kann das
PS: Ich würde ja grob anhand der Datei C:\sergebnis.txt erkennen, ob die Batch gelaufen ist oder nicht....
edit
Gruß
ich weiß, diese Frage wurde hier schon mehrfach gestellt, aber nie richtig gelöst bzw. beantwortet.
- dann hast du doch bestimmt 1- 10 Beispiele/gestellte Fragen, die wir "richtig" lösen oder beantworten könnten?
mein anderes Batchfile schreibt sind auch immer noch im System.
Mach mir kein X für ein U vor...
Apropos X, SETx kann das
PS: Ich würde ja grob anhand der Datei C:\sergebnis.txt erkennen, ob die Batch gelaufen ist oder nicht....
edit
send_nsca.exe -H 192.168.20.100 -p 5667 -c C:\send_nsca_win32_src\send_nsca\bin\send_nsca.cfg <C:\sergebnis.txt
was soll uns diese zeile sagen?
/editwas soll uns diese zeile sagen?
Gruß
Hallo Oli,
Wie wäre es mit folgender Theorie:
Die Variable
Übrigens:
Gruß
Friemler
Wie wäre es mit folgender Theorie:
Die Variable
check3
ist nicht vorhanden. Deshalb wird in Zeile 3 Deines Scripts die Variable size
nicht gesetzt. Daraufhin schlägt die Ausführung von Zeile 5 fehl (dort steht dann nämlich if leq 79999999 goto kleiner
). -> Das Batchfile bricht mit einem Syntaxfehler ab.Übrigens:
SETX
setzt Werte in der Registry, die meines Wissens nach einen Reboot nicht überleben.Gruß
Friemler
Hi Oli,
klassischer Fehler, nimm's locker, war halt nicht Dein Tag .
Von wegen der Aussage "Die gesetzten Variablen überleben einen Reboot nicht" - vergiss es.
Aber Achtung!
Die Variablen, die Du mit
Gruß
Friemler
klassischer Fehler, nimm's locker, war halt nicht Dein Tag .
SETX
ist ein Konsolentool von Microsoft, das in Server 2008 enthalten sein müsste. Eine Beschreibung gibt es hier. Damit kannst Du das von Dir gewünschte erreichen. Allerdings wäre es eine Überlegung wert, ob Du Dein Problem nicht anders lösen könntest. Dafür wäre es natürlich nützlich, das andere Batchscript zu kennen und genaueres über die Hintergründe zu wissen.Von wegen der Aussage "Die gesetzten Variablen überleben einen Reboot nicht" - vergiss es.
Aber Achtung!
Die Variablen, die Du mit
SETX
im globalen Environment setzt, sind in dem Batchfile, in dem Du den Befehl ausführst, nicht direkt vorhanden, erst in danach gestarteten Instanzen von CMD! Um das zu umgehen (falls Du die Variablen auch im weiteren Verlauf des aktuellen Batchfiles benötigst), musst Du die Variablen nochmal mit dem normalen SET
-Befehl setzen.Gruß
Friemler
Hallo Oli,
ich habe Dein Script Nr. 1 mal überarbeitet:
Meine Änderungen:
Da in diesem Batchfile der Wert von
Teste jetzt erstmal meinen Code, dann sehen wir weiter.
Was meinst Du damit genau? Meinst Du Dein Script Nr. 1 oder verstehst Du den Fehler noch nicht so ganz, den Du gemacht hast?
Gruß
Friemler
ich habe Dein Script Nr. 1 mal überarbeitet:
@echo off & setlocal
set "VBScript=%Temp%\GetDateOfYesterday.vbs"
> "%VBScript%" echo strYesterday = DateAdd("d", -1, Now)
>>"%VBScript%" echo WScript.Echo Right("0" ^& Day(strYesterday), 2) ^& "." ^& _
>>"%VBScript%" echo Right("0" ^& Month(strYesterday), 2) ^& "." ^& _
>>"%VBScript%" echo Year(strYesterday)
for /f "tokens=1-3 delims=." %%a in ('cscript /nologo "%VBScript%"') do (
set "Day=%%a"
set "Month=%%b"
set "Year=%%c"
)
del "%VBScript%"
set "gestern=%year%%month%%day%"
set "check1=N:\XYZ%gestern%.zip"
set "check2=N:\ABC%gestern%.zip"
set "check3=N:\DEF%gestern%.zip"
set "check4=N:\GHI%gestern%.zip"
set "check="%check1%","%check2%","%check3%","%check4%""
set "host=xxx"
set "service=Backup_Pruefung"
REM Prüfung ob als Ausgabe ein "Files OK" zurückkommt.
for /f "tokens=2" %%i in ('call "C:\check_file.exe" --target %check% --filter "age le 24h" --critical 0') do set "ergebnis=%%i"
if /i "%ergebnis%" equ "OK" (
set "errcd=0"
) else (
set "errcd=2"
)
>"C:\Ergebnis.txt" echo %host% %service% %errcd% %ergebnis%
cd /d "C:\send_nsca_win32_src\send_nsca\bin"
<"C:\Ergebnis.txt" send_nsca.exe -H xxx -p 5667 -c "send_nsca.cfg"
Meine Änderungen:
- Zunächstmal habe ich den Batchcode zur Berechnung des gestrigen Datums entfernt und durch ein Inline-VBScript ersetzt. Das ist erstens kürzer und übersichtlicher und zweitens sicherer, da vom eingestellten Datumsformat des Systems unabhängig.
- Ich habe drei goldene Regeln für Batchscripting angewandt:
- Die Zuweisungen von
SET
-Befehlen immer in Anführungszeichen setzen - das vermeidet Probleme mit eventuell enthaltenen Sonderzeichen und verhindert, dass sich versehentlich ein Leerzeichen an den zuzuweisenden Wert anhängt. - Pfade und Variablen, die Pfade enthalten, immer in Anführungszeichen einschließen - das vermeidet Probleme mit Pfaden, die Leerzeichen enthalten.
- Bei
ECHO
-Befehlen, die per Ausgabeumleitung in eine Datei schreiben sollen, die Umleitung immer vor denECHO
-Befehl schreiben - vermeidet auch Probleme. Zu erklären welche, wäre jetzt zu langatmig. - Ich habe die Ermittelung des Rückgabewertes von
check_file.exe
optimiert (Zeile 32). Ich bin aufgrund Deines Codes davon ausgegangen, dass das Programm inC:\
liegt, evtl anpassen. DerCALL
-Befehl vor dem Programmpfad steht dort zur Sicherheit, falls der reale Pfad Leerzeichen enthält; in dem Fall istCALL
notwendig. Die Prüfung obOK
zurückgeliefert wurde (Zeile 34) berücksichtigt wegenif /i
die Groß-/Kleinschreibung nicht. BTW: IstFile OK
die einzige Ausgabe des Programms oder kommen da noch mehr Zeilen vorher/hinterher? In dem Fall funktioniert es so nicht. - Du wechselst an zwei Stellen mit
cd <Verzeichnis>
das Verzeichnis. Ich nehme mal an, dass Du damit beabsichtigt hast, das jeweilige Verzeichnis zum aktuellen Verzeichnis zu machen. Dazu muss abercd /d <Verzeichnis>
verwendet werden. Einer dieser Befehle im Zusammenhang mitcheck_file.exe
ist weggefallen, den anderen habe ich angepasst (Zeile 42).
Da in diesem Batchfile der Wert von
errcd
davon abhängt, was check_file.exe
zurückliefert und in dem Batchfile aus Deinem Eröffnungsposting von der Größe der Datei N:\DEF%gestern%.zip
, konnte ich das nicht unter einen Hut bringen/nicht einbauen, dazu müsstest Du zuerst noch ein paar Worte verlieren.Teste jetzt erstmal meinen Code, dann sehen wir weiter.
Was meinst Du damit genau? Meinst Du Dein Script Nr. 1 oder verstehst Du den Fehler noch nicht so ganz, den Du gemacht hast?
Gruß
Friemler
Hallo Oli,
also soll nur eine zusätzliche Nachricht erzeugt werden. Dann sollte es ja ausreichen, folgenden Code an mein Script anzuhängen:
Das VBScript ist eigentlich ganz simpel. Die erste Zeile mit dem
Ist Dein Problem damit gelöst? Dann möchte ich schonmal an den "grünen Haken" erinnern .
Gruß
Friemler
also soll nur eine zusätzliche Nachricht erzeugt werden. Dann sollte es ja ausreichen, folgenden Code an mein Script anzuhängen:
for %%f in ("%check3%") do set "size=%%~zf"
if %size% leq 79999999 (
set "errcd=2"
set "ergebnis=ACHTUNG Die Datei ist kleiner als 80 MB!"
) else (
set "errcd=0"
set "ergebnis=Die Datei ist groesser als 80 MB."
)
set "service=Backup_Groesse"
>"C:\sergebnis.txt" echo %host% %service% %errcd% %ergebnis%
<"C:\sergebnis.txt" send_nsca.exe -H XXX -p 5667 -c "send_nsca.cfg"
Das VBScript ist eigentlich ganz simpel. Die erste Zeile mit dem
DateAdd
addiert -1 auf das aktuelle Datum (Now
) und berechnet so das Datum vom Vortag. Die folgenden Ausdrücke (z.B. Right("0" & Month(strYesterday), 2)
) extrahieren den Tag, den Monat bzw. das Jahr aus diesem Datum und sorgen dafür, dass Monat und Tag führende Nullen haben (z.B. "verkette "0" und die Monatsnummer, nimm vom resultierenden String 2 Zeichen von rechts"). Statt &
steht da ja immer ^&
, das ist nötig um das &
zu "escapen", damit CMD beim Ausführen der Zeilen das &
nicht als Steuerzeichen für sich selbst interpretiert, sondern es einfach in die Zieldatei schreibt. Durch den Operator _
am Ende der ersten beiden Zeilen werden die Zeilen 2 bis 4 miteinander verkettet und als eine Zeile interpretiert. Zwischen den Zahlenwerten werden als Trennzeichen noch Punkte ausgegeben. Die werden von der nachfolgenden FOR
-Schleife, die das VBScript ausführt und seine Ausgabe auswertet, als Trennzeichen behandelt (delims=.
) um so an die einzelnen Werte zu kommen.Ist Dein Problem damit gelöst? Dann möchte ich schonmal an den "grünen Haken" erinnern .
Gruß
Friemler
Hallo Oli,
tja, das kommt davon, wenn man (ich) nachträglich noch am Script herumfummelt . Kopiere Dir noch mal die aktuelle Version des Scripts, da ist das Komma bei den Variablen
[EDIT]
Die Erweiterung enthielt auch noch einen Fehler . Bitte auch noch mal neu kopieren.
[EDIT2]
Ah, den hast Du ja schon korrigiert (die Anführungszeichen bei
[/EDIT2]
[/EDIT]
Gruß
Friemler
tja, das kommt davon, wenn man (ich) nachträglich noch am Script herumfummelt . Kopiere Dir noch mal die aktuelle Version des Scripts, da ist das Komma bei den Variablen
checkX
entfernt. Dann sollte es funktionieren.[EDIT]
Die Erweiterung enthielt auch noch einen Fehler . Bitte auch noch mal neu kopieren.
[EDIT2]
Ah, den hast Du ja schon korrigiert (die Anführungszeichen bei
set size=..
).[/EDIT2]
[/EDIT]
Gruß
Friemler
Hallo Oli,
tja, da musst Du nochmal die Ausgabe von
BTW: Die ganzen Werte
Gruß
Friemler
tja, da musst Du nochmal die Ausgabe von
check_file.exe
genauer analysieren. Starte es mal direkt mit den Parametern, die in der FOR
-Schleife im Script verwendet würden. Ich hatte ja (aber auch nachträglich ) geschrieben, dass man da nochmal forschen muss, und zwar für ein positives als auch für ein negatives Ergebnis.BTW: Die ganzen Werte
%host% %service% %errcd% %ergebnis%
werden ja in eine Zeile von C:\ergebnis.txt
bzw. später C:\sergebnis.txt
geschrieben. Im zweiten Fall ist das ja ein String (z.B. ACHTUNG Die Datei ist kleiner als 80 MB!
), der Leerzeichen enthält. Wenn es möglich ist, sollte deshalb %ergebnis%
in beiden Zeilen in Anführungszeichen eingeschlossen werden, damit das auch als zusammenhängender Wert erkannt wird.Gruß
Friemler