2016-07-21 7 views
5

Ich versuche, die Ausgabe von net stop zu protokollieren, während auch ERRORLEVEL gefangen wird.ERRORLEVEL in FOR/F Befehlsschleife gibt unerwartetes Ergebnis zurück

Basierend auf this question ich versucht, die folgenden aus einer verschachtelten Unterprogramm:

set /a loopIndex=0 
for /F "usebackq delims=" %%i in (`net stop %SERVICE_NAME%`) do (
if !loopIndex! EQU 0 if !errorlevel! EQU 1 set statementError=1 
set /a loopIndex+=1 
call :logMessage "%%i" 
) 
echo statementError: %statementError% 

Dies ist jedoch nicht funktioniert, werfen 1 auch wenn net stop gelingt.

Ist dies ohne eine temporäre Datei möglich? Wenn nicht, wie würde eine temporäre Dateilösung aussehen?

+0

ERRORLEVEL ist keine Umgebungsvariable. Es muss nicht mit% oder! Umgeben sein. 'IF ErrorLevel 1' funktioniert einwandfrei. –

+0

Lesen Sie den verknüpften Beitrag erneut. * Zusätzlich zu diesem internen Status können Sie, wenn Sie möchten, eine Umgebungsvariable mit dem Namen ERRORLEVEL ** erstellen, genauso wie Sie eine Umgebungsvariable namens FRED erstellen können. Aber wie bei FRED hat diese Variable keinen Einfluss auf die Fehlerstufe. * (** Betonung meiner **). –

+1

@KenWhite 'ERRORLEVEL' * ist * eine automatische Umgebungsvariable, genau wie' CD', 'DATE' oder' RANDOM'. – dxiv

Antwort

2

Während @ dbenham des answer für Fälle geeignet ist, wo %ERRORLEVEL% einen binären Wert zurückgibt, war ich nicht in der Lage zu bestätigen, noch dementieren, ob der zurückgegebenen Beendigungscodes für net stop tatsächlich binär ist und so für eine n-stufige Lösung entschieden.

Wie pro @ dbenham der DOS tips forum post:

net stop MyService 2^>^&1 ^& CALL ECHO %%^^ERRORLEVEL%%^>error.level 
net stop MyService 2>&1 & CALL ECHO %^ERRORLEVEL%>error.level 
echo %ERRORLEVEL%>error.level 

Hier:

FOR /F "delims=" %%i IN ('net stop MyService 2^>^&1 ^& CALL ECHO %%^^ERRORLEVEL%%^>error.level') DO (
CALL :logMessage "%%i" 
) 
FOR /F "delims=" %%i IN (error.level) DO (SET /A statementError=%%i) 
DEL error.level 
IF %statementError% NEQ 0() 

die Anweisung Parsing Breaking downwird speziell verwendet, um das Parsing von %ERRORLEVEL% bis zur Ausführung von ECHO zu verzögern.

+0

Da die Datei 'error.level' nur eine einzige Zeile enthält, können Sie sie wie' set/P statementError = "" <"error.level" 'lesen, oder, falls die Datei nicht existiert oder leer ist,' set "statementError = 0" & set/P statementError = "" <"error.level" 2> nul' ... – aschipfl

2

Der FOR/F-Befehl führt NET STOP in einem neuen cmd.exe-Prozess aus. FOR/F verarbeitet stdout, aber das ist es. Das Hauptscript kann keine Variablenwerte sehen, die der FOR/F-Befehl möglicherweise erstellt, da sie nach dem Beenden des Unterprozesses nicht mehr vorhanden sind.

Die einfachsten und effizientesten Lösungen verwenden eine temporäre Datei. Ich nehme an, NET STOP hat zwei mögliche Fehlercodes - Erfolg = 0 und Fehler = 1. So ist die einfachste Lösung, einfach eine temporäre Fehlersignaldatei zu erstellen, wenn ein Fehler aufgetreten ist.

Im Folgenden zeigt das Konzept in allgemeiner Weise:

@echo off 
del error.flag 2>nul 
for /f "delims=" %%A in ('net stop %SERVICE_NAME% ^|^| echo error>error.flag') do (
    ... 
) 
if exist error.flag (
    echo There was an error 
    del error.flag 
) 

Sie könnten genauso gut die Fehlerprüfung innerhalb des DO put() Code, falls gewünscht.

Verwandte Themen