n0cturne
Goto Top

If ERRORLEVEL funktioniert nicht richtig

Hallo zusammen,

ich möchte mir ein Skript bauen, welches bestimmte Windows Dienste erst Stoppt, den Status checkt, sie wieder startet und wieder den Status checkt.

Habe erst mal mit den Checks begonnen
@echo off
setlocal EnableDelayedExpansion
title Restart CRM CTI

:Variables
set log=%~n0.log

:StopServices
echo StopServices
for /f "delims=; tokens=1 skip=1" %%a in (restart_crm_cti_svc_order.ini) do (  
	set svc_name=%%a
	sc query !svc_name! | findstr /i STOPPED >nul
	echo ---- %errorlevel% - !svc_name!
	if ERRORLEVEL 0 (
		echo if   %errorlevel% - !svc_name! - STOPPED
	) else (
		echo else %errorlevel% - !svc_name! - RUNNING
	)
)

:StartServices
echo StartServices
for /f "delims=; tokens=2 skip=1" %%a in (restart_crm_cti_svc_order.ini) do (  
	set svc_name=%%a
	sc query !svc_name! | findstr /i RUNNING >nul
	echo ---- %errorlevel% - !svc_name!
	if ERRORLEVEL 0 (
		echo if   %errorlevel% - !svc_name! - RUNNING
	) else (
		echo else %errorlevel% - !svc_name! - STOPPED
	)
)

Die Dienste sind aktuell gestartet, und die errorlevel werden in beiden for-Loops korrekt ausgegeben.
Zu Debuggingzwecken habe ich an verschiedenen Stellen errorlevel in die Konsole ausgegeben:
StopServices
---- 0 - CtiProvider
if   0 - CtiProvider - STOPPED
---- 0 - OpenScapeCTI
if   0 - OpenScapeCTI - STOPPED
---- 0 - TapiSrv
if   0 - TapiSrv - STOPPED
StartServices
---- 1 - TapiSrv
if   1 - TapiSrv - RUNNING
---- 1 - OpenScapeCTI
if   1 - OpenScapeCTI - RUNNING
---- 1 - CtiProvider
if   1 - CtiProvider - RUNNING

In der ersten for-Loop hätte eigentlich die else-Klausel greifen müssen - tut sie aber nicht.
Mach ich irgendwas bei der Abfrage von errorlevel falsch?

Beste Grüße
Benjamin

Content-ID: 1414399504

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

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

n0cturne
Lösung n0cturne 21.10.2021 um 14:46:38 Uhr
Goto Top
Hab noch ein bisschen weiter google bemüht.
Die if-Abfrage des Errorlevels muss folgendermaßen lauten:
if "%errorlevel%" == "0"

Kaum macht mans richtig - schon funktionierts. :D
149569
149569 21.10.2021 aktualisiert um 17:11:19 Uhr
Goto Top
Zitat von @n0cturne:

Hab noch ein bisschen weiter google bemüht.
Die if-Abfrage des Errorlevels muss folgendermaßen lauten:
if "%errorlevel%" == "0"

Kaum macht mans richtig - schon funktionierts. :D

Auch das ist hier leider nicht richtig, denn die IF Abfrage des Errorlevels befindet sich innerhalb eines For-Loops (Klammern) und hier musst du delayed Expansion für Variablen die abgefragt werden nutzen weil du den sc Befehl ja auch innerhalb der Klammern ausführst, also das Errorlevel statt in Prozentzeichen in Ausrufezeichen kapseln!
if "!errorlevel!" == "0"  
Alternativ kann man sowas machen statt die Errorlevel Variable langwierig abzufragen
sc query !svc_name! | findstr /i RUNNING >nul 2>&1 && (
    echo success
) || (
    echo failed
)