o0julia0o
Goto Top

Batch: Ergebnis aus Befehl abfragen und nutzen. If Errorlevel oder sowas

hey, ich habe folgenden Befehl in einer batch:

net stop "Radmin VPN Control Service"

Als Antwort erhalte ich:
"Systemfehler 5 aufgetreten.

Zugriff verweigert"

Weil die Datei als Administrator ausgeführt werden muss. Diese Fehlermeldung möchte ich nutn nutzen um in der Batch halt auszugeben:
"Datei als Administrator starten"

Also so etwas wie:
if errorlevel "systemfehler 5 augetreten" goto Admininfo  
:Admininfo
echo Datei als Administrator ausführen

Mein Versuch:
echo off
net stop "Radmin VPN Control Service"  
if %ERRORLEVEL% == 5 (
set Variable = 1
if Variable == 1 goto Admininfo
:Admininfo
echo Datei als Administrator starten
pause
exit


Wie geht das? Danke!

Content-ID: 530279

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

Ausgedruckt am: 25.11.2024 um 21:11 Uhr

142232
Lösung 142232 30.12.2019 aktualisiert um 15:50:52 Uhr
Goto Top
Pack das an den Anfang des Batch-Skripts dann erübrigt sich der Hinweis 😉
net session >nul 2>&1 || (powershell start -verb runas '%~0' &exit /b)  
Damit wird die Batch elevated gestartet sofern sie noch nicht elevated läuft.
LukasD
Lösung LukasD 30.12.2019 um 15:43:32 Uhr
Goto Top
Hi Julia,

ich verwende da meistens eine Abfrage ganz zu beginn des Scripts:
rem Rechte prüfen
echo Rechte werden geprueft
net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative Rechte wurden bestaetigt.
    ) else (
	Color 4f
        echo Failure: Keine ausreichenden Rechte. Bitte als Admin starten!
		pause
		exit
    )

Falls es ohne Admin Rechte gestartet wird färbt sich das Fenster rot und es wird eine Fehlermeldung ausgegeben.
o0Julia0o
o0Julia0o 30.12.2019 aktualisiert um 16:12:25 Uhr
Goto Top
Danke! Aber wie frage ich von einem Befehl der gerade ausgeführt wurde, den Ergebniswert ab? In diesem Fall dieses:

"Systemfehler 5 aufgetreten.

Zugriff verweigert"

So könnte ich bei irgendeinem Fehler die Batch in eine Pause laufen lassen. Und wenn nicht sie direkt beenden lassen.
142232
Lösung 142232 30.12.2019, aktualisiert am 31.12.2019 um 09:53:39 Uhr
Goto Top

WhateverCommand && (
    echo Success
) || (
    echo Failed
)
Voraussetzung dafür ist natürlich, dass der ausgeführte Befehl einen korrekt gesetzten Errorlevel zurückgibt. Tut er das nicht kann man aber auch das beheben indem man nach bestimmten Ausgabewerten mit einem in der Pipe nachgeschalteten find oder findstr arbeitet welcher dann einen richtigen Errorlevel ausgibt der ausgewertet werden kann.

Einfach mal lesen
https://it-stack.de/26/08/2010/batch-if-errorlevel/
https://sites.google.com/site/batchprogrammierung/befehle/befehle/if
o0Julia0o
o0Julia0o 04.01.2020 aktualisiert um 11:18:57 Uhr
Goto Top
Danke. Funktioniert. Wie frage ich denn einen Errorlevel den der vorherige Befehl ausgibt ab?

Es gibt ja mehr als 2 Errorlevel. Durch testen herausgefunden habe ich, dass:
net stop "Radmin VPN Control Service"

wenn der Prozess bereits gestartet ist Errorlevel 2 ausgibt, wenn man versucht ihn zu beenden. das wäre ja dann für die Erfolgsanzeige auch o.k. Aber alle anderen Errorlevel außer 0 & 2 sind nicht o.k.

So sieht dann mein Code aus(aber wie gesagt, Errorlevel2-Ausgabe nur durch Durchprobieren herausgefunden):
net stop "Radmin VPN Control Service"  
    if %errorLevel% == 2 (
        echo Success: Prozess bereits gestoppt
    ) else (
	    if %errorLevel% == 0 (
        echo Success: Prozess wurde gestoppt
pause
    ) else (
	Color 4f
        echo Failure: 
		pause
		exit
    ))