torillo
Goto Top

CMD-Ergebnis in Variable speichern und diese Variable dann andere Batchdatei übergeben

Hallo Forum,

ich habe ein Problem mit der Übergabe einer Variable von einer in eine andere Batchdatei und würde mich über Eure Hilfe freuen.

Folgendes sollen die Batchdateien machen:
1. Schauen, ob ein Dienst läuft
2a. Wenn er läuft abschalten und eine Mail per Blat versenden
2b. Wenn er nicht läuft starten und eine Mail per Blat versenden

Dabei würde ich gerne die Ergebnisse der Befehle "net start Dienstname" bzw. "net stop Dienstname", also "Dienstname wurde erfolgreich gestartet" bzw. "Dienstname wurde erfolgreich gestoppt" in den Mailbody schreiben lassen. Das könnte ich ja auch manuell in den Mailbody reinschreiben, aber dann weiß ich nicht, ob der Dienst wirklich gestartet/gestoppt wurde.

Hier nun die Batchdateien:

1. Batchdatei zum Dienst starten/stoppen:
@echo off
REM nachsehen, ob der Dienst läuft
net start|find /i "Dienstname"

REM Wenn der Dienst läuft errorlevel ist gleich 0 (also kein Fehler/Error), wenn er nicht läuft errorlevel ist gleich 1 (also Fehler/Error)
If errorlevel 1 (

REM Wenn Fehler (errorlevel=1), also Dienst läuft nicht, dann Dienst starten und Start-Mail versenden
for /f "tokens=*" %%i in ('net start "Dienstname"') do set gestartet=%%i
call C:\Scripts\MailOhneAnhang.cmd "Mailsubject: Dienstname gestartet am %date% um %time% Uhr" "Mailbody: Ergebnis net start: %gestartet%"
) else (

REM Wenn kein Fehler (errorlevel=0), also Dienst läuft, dann Dienst stoppen und Stop-Mail versenden
for /f "tokens=*" %%i in ('net stop "Dienstname"') do set gestoppt=%%i
call C:\Scripts\MailOhneAnhang.cmd "Mailsubject: Dienstname gestartet am %date% um %time% Uhr" "Mailbody: Ergebnis net stop: %gestoppt%"
)

2. Und hier die Batchdatei für den Mailversand per Blat, MailOhneAnhang.cmd:
C:\scripts\blat\full\blat.exe -to empaenger@domain.de ^
-f absender@domain.de ^
-u user -pw passwort -server smtp.domain.de ^
-s %1 ^
-body %2%

Die Mails kommen an mit passendem Betreff und im Mailbody steht:"Mailbody: Ergebnis net start" bzw. "Mailbody: Ergebnis net stop", aber die Variable %gestartet% bzw. %gestoppt% wird nicht angezeigt.

Hat jemand einen Rat, woran es liegen könnte?

Vielen Dank schon im Voraus!

Content-Key: 229804

Url: https://administrator.de/contentid/229804

Printed on: April 24, 2024 at 22:04 o'clock

Member: Clijsters
Clijsters Feb 14, 2014 at 13:48:56 (UTC)
Goto Top
Hi,
einen Rat, eine Idee tatsächlich:

Du versuchst innerhalb einer for-loop eine Variable zu setzen und weiterzugeben.
Hier gibt's genaueres dazu:
http://www.robvanderwoude.com/variableexpansion.php

Das wurde hier im Forum auch bereits mehrfach besprochen, wenn ich mich nicht irre.
Aber das ist kein Problem, ich habe selber gerade mal gesucht und keinen Beitrag dazu auf die Schnelle finden können.

Beste Grüße
Dominique
Member: bastla
bastla Feb 14, 2014 at 14:28:49 (UTC)
Goto Top
Hallo torillo!

Wenn die Variablen %gestartet% bzw %gestoppt% keine weitere Funktion haben, kannst Du sie auch gleich einsparen:
If errorlevel 1 (
    REM Wenn Fehler (errorlevel=1), also Dienst läuft nicht, dann Dienst starten und Start-Mail versenden
    for /f "tokens=*" %%i in ('net start "Dienstname"^|find "erfolgreich"') do call C:\Scripts\MailOhneAnhang.cmd "Mailsubject: Dienstname gestartet am %date% um %time% Uhr" "Mailbody: Ergebnis net start: %%i"  
) else (
    REM Wenn kein Fehler (errorlevel=0), also Dienst läuft, dann Dienst stoppen und Stop-Mail versenden
    for /f "tokens=*" %%i in ('net stop "Dienstname"^|find "erfolgreich"') do call C:\Scripts\MailOhneAnhang.cmd "Mailsubject: Dienstname gestartet am %date% um %time% Uhr" "Mailbody: Ergebnis net stop: %%i"  
)
Falls das Starten oder Stoppen nicht funktioniert, bekommst Du allerdings keine Ausgabe auf STDOUT (Kanal 1) sondern auf STDERR (Kanal 2) und somit auch keine Mail - daher könntest Du als Alternative jede Ausgabe in eine Datei umleiten und diese als Mailbody verwenden:
net start "Dienstname" >Ergebnis.txt 2>&1
Grüße
bastla
Member: torillo
torillo Feb 14, 2014 at 16:19:37 (UTC)
Goto Top
Hallo und danke euch zwei für die Antworten. Der Vorschlag von Dir, bastla, sieht/sah für mich aus, kurzfristig zu einer Lösung zu kommen. Hab das dann so umgesetzt mit der Ergebnis.txt. Allerdings kann Blat aus welchen Gründen auch immer nicht auf die Datei zugreifen. Aber nur dann, wenn ich tatsächlich einen Dienst starte/stoppe in der Batch. Dann kommt in Blat der Fehler "Unkwon error 2 when trying to open ergebnis.txt". Wenn ich "net start" oder "net stop" durch ein "net start|find" ersetze, also nur gucke, ob der Dienst läuft, ist der Zugriff/Versand der Mail mit der Ergebnis.txt im Mailbody möglich. Also quasi dann, wenn eine Aktion ausgeführt wird, für die die CMD mit Adminrechten ausgeführt werden muss, geht der Zugriff auf Ergebnis.txt nicht. Dann kann man die Datei auch nicht ändern und unter gleichem Namen speichern.

Vielleicht hat jemand dazu noch einen Tipp?

Danke vielmals!!!
Member: torillo
torillo Feb 14, 2014 at 16:33:43 (UTC)
Goto Top
Noch ein kurzer Nachtrag:

Wenn ich wie oben beschrieben, KEINE Aktion der Batchdatei ausführe, die - ausgeführt in einer CMD - Administratorrechte benötigt und die Batchdatei dann "normal" starte (also nicht mit "Ausführen als Administrator"), funktionierts einwandfrei. Nur wenn ich die Batch "Als Administrator ausführe" kommen die oben beschriebenen Fehler.

Da die Batch aber mit Adminrechten ausgeführt werden muss, weil sonst net start bzw. net stop nicht ausgeführt werden, beißt sich die Katze hier in den Schwanz...

Für jeden Tipp bin sehr dankbar!!!!

Torillo
Member: bastla
bastla Feb 14, 2014 at 17:06:19 (UTC)
Goto Top
Hallo torillo!

Speichere die Datei "Ergebnis.txt" in einem Ordner, für den "Jeder" zumindest Lesezugriff hat ...

Grüße
bastla
Member: torillo
torillo Feb 17, 2014 at 09:18:35 (UTC)
Goto Top
Hallo bastla,

leider hat das nichts genützt mit den Berechtigungen, ich propiere es jetzt nochmal auf einem anderen Rechner ...

Danke für Deine Hilfe!

Torillo