anmelder
Goto Top

Bedeutung von RD Errorlevel 1 und Abweichung von errorlevel Meldungen in Batch und Konsole

Ich lösche einen Flashspeicher im Netzwerk mit:

SET Buchstabe=z
...
RD !Buchstabe!: /s /q

Ich habe den Code vor Tagen erfolgreich getestet und er lief mit Errorlevel 0 durch.

Heute bemerke ich daß ich errorlevel 1 bekomme obwohl der Speicher komplett gelöscht wird und in der Konsole erhalte ich wie gewünscht errorlevel 0

Ich kann hier nicht den gesamten Code posten, er sollte den RD Befehl wohl auch nicht betreffen, der Laufwerkbuchstabe wird richtig angegeben.

Was genau bedeutet errorlevel 1 bei RD und unter welchen Umständen kann Code in der Konsole von einer Batch Datei abweichen? Beide haben Adminrechte.

Content-ID: 353713

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

Ausgedruckt am: 23.11.2024 um 10:11 Uhr

Penny.Cilin
Penny.Cilin 04.11.2017 um 19:42:48 Uhr
Goto Top
Und schon wieder ohne Begrüssung!
Regel Nr. 1: Netiquette

Vergisst Du auch im realen Leben das Grüssen?

Und der Errorlevel 1 ist unabhängig von der Aktion.
Prüfe es mit
net helpmsg <x>
. Ersetze <x> sinngemäß.

Errorlevel 1 heißt "Unzulässige Funktion" unter Windows 7, 8, 10.

Gruss Penny
anmelder
anmelder 04.11.2017 um 20:11:46 Uhr
Goto Top
Hallo,
das ist hier irgendwie anders, ich mache mir mehr Gedanken um den Text face-sad

Das kann aber nicht die richtige Lösung für den RD Befehl zu sein. Wenn eine Funktion unzulässig ist kann sie ja nicht durchgeführt werden und sie arbeitet sowohl in der Batch als auch in der Konsole erfolgreich und vor allem hatte ich den Fehler zuvor nicht, erst heute.

Wenn es nur um Unzulässigkeit geht könnte ich natürlich den errorlevel 1 als zulässig. Das Programm wurde ja getestet und der Befehl somit nicht falsch angewendet. Wichtig ist nur daß Schreibfehler usw. weiterhin zu einer Fehlermeldung führen.

Mit NET HELPMSG kann ich nicht so richtig etwas anfangen. Laut NET HELPMSG: brauche ich eine 4-stellige Identifikationsnummer der Windows-Meldung, die habe ich ja nicht. Ich glaube auch nicht daß ein Netzwerkfehler vorliegt weil der Speicher ja gelöscht wird.

Gruß,
Penny.Cilin
Penny.Cilin 04.11.2017 um 20:23:19 Uhr
Goto Top
Hallo,

und hier derTechNet Artikel.

Das ist egal, ob ich
net helpmsg 0001
oder
net helpmsg 1
angebe. Es ergibt immer dieselbe Meldung zurück.
Die führenden Nullen kann man weglassen.

Und außerdem ist Net helpmsg nicht nur für Netzwerkfehler, sondern zeigt den Fehlercode auch für lokal an.

net helpmsg 5
ergibt "Zugriff verweigert", unabhängig davon ob der Zugriff lokal oder auf einem Netzwerkshare erfolgt.

Gruss Penny
Penny.Cilin
Penny.Cilin 04.11.2017 um 20:29:23 Uhr
Goto Top
Zitat von @anmelder:

Hallo,
das ist hier irgendwie anders, ich mache mir mehr Gedanken um den Text face-sad
Das heißt aber trotzdem nicht, daß man die Begrüssung außer acht läßt.

Das kann aber nicht die richtige Lösung für den RD Befehl zu sein. Wenn eine Funktion unzulässig ist kann sie ja nicht durchgeführt werden und sie arbeitet sowohl in der Batch als auch in der Konsole erfolgreich und vor allem hatte ich den Fehler zuvor nicht, erst heute.
Und was wurde in der Zwischenzeit geändert?
Windows Updates?
Was sagt den die Ausgabe, wenn Du Echo On setzt?
Wird der Befehl nun korrekt ausgeführt oder nicht?

Wenn es nur um Unzulässigkeit geht könnte ich natürlich den errorlevel 1 als zulässig.
Was jetzt? Ist es zulässig oder unzulässig? - Du widersprichst Dir selber.

Das Programm wurde ja getestet und der Befehl somit nicht falsch angewendet.
Was für ein Programm wurde getestet? oder meinst Du das Batchfile?

Wichtig ist nur daß Schreibfehler usw. weiterhin zu einer Fehlermeldung führen.
Welche Schreibfehler meinst Du? Erkläre dies.

Gruß,

Gruss Penny
rubberman
rubberman 04.11.2017 aktualisiert um 23:56:48 Uhr
Goto Top
Die CMD ist von Leuten entwickelt worden, die extrem abhängig von haluzinogenen Substanzen waren face-wink
https://stackoverflow.com/questions/11137702/batch-exit-code-for-rd-is-0 ...

Mit an Sicherheit grenzender Wahrscheinlich kommt weder Errorlevel 0, noch 1 vom RD Befehl.

Steffen
anmelder
anmelder 05.11.2017 aktualisiert um 12:03:45 Uhr
Goto Top
Ich habe das Problem jetzt eingegrenzt:

echo !Ladepfad! %Partition%
echo on
set errorlevel=99
echo %errorlevel% aa
set errorlevel=
echo %errorlevel% bbb
rd z: /s /q
echo %errorlevel% ccc
pause

REM Sucht den Pfad zur eingegebenen Kennummer. Datei muß mit einer Zahl beginnen
FOR /R "%GESAMTSICHERUNGSPFAD%" %%a IN (*%DATEIENDUNG%) DO (    
 ECHO %%~nxa| findstr /b "%Partition%" >nul 2>&1 && (  
  SET "Ladepfad=%%a"  
 )
)

echo schleifenfehler  %errorlevel% 
echo on
set errorlevel=99
echo %errorlevel% dd
set errorlevel=
echo %errorlevel% ee
rd z: /s /q
echo %errorlevel% ff
pause

Ausgaben:

99 aa
0 bbb
0 ccc

schleifenfehler 1
99 dd
1 ee
1 ff


Damit ist belegt daß der Fehler zwar beim RD Befehl auftritt aber mit ihm nichts zu tun hat, wie rubberman schon feststellte. Der Fehler tritt erst nach der FOR Schleife auf.
In einer anderen Datei konnte ich den Fehler nicht nachstellen.


Am Rechner wurde nichts geändert, es gab nur 2 Abstürze bei denen Windows Informationen sammelte und neu gestartet werden mußte.
Echo On bringt keine neuen Erkenntnisse.

Das Problem tritt auch auf der lokalen Festplatte auf, so ist ein Netzwerkfehler auszuschließen.
anmelder
anmelder 05.11.2017 um 13:34:41 Uhr
Goto Top
set errorlevel=0 ist die Lösung, nicht set errorlevel=

Nur ist mir nicht klar weshalb das Problem erst jetzt auftrat.

Egal. Danke
Penny.Cilin
Penny.Cilin 05.11.2017 um 13:51:41 Uhr
Goto Top
Hm, mit
set errorlevel=
löscht Du die Variable, wenn mich nicht alles täuscht.

Warum Du dies auf
set errorlevel=0 
setzt erschließt mich jetzt nicht.

Gruss Penny
anmelder
anmelder 05.11.2017 aktualisiert um 14:44:13 Uhr
Goto Top
Weil ich an der Stelle dann weiterkam und die richtigen Werte hatte. Ich dachte der Errorlevel wird so zurückgesetzt.

Folgendes Experiment belegt aber das Gegenteil:

set errorlevel=5
IF NOT errorlevel 1 echo kein fehler %errorlevel%

IF errorlevel 1 echo fehler %errorlevel%

Es wird die Meldung "kein Fehler 5" ausgegeben. Offenbar handelt es sich hier um 2 Variabeln und der Wert wird mit set errorlevel=0 gar nicht zurückgesetzt. auch set /a hilft nicht. Wie wird der Errorlevel wirklich auf 0 gesetzt?

Die endgültige Lösung ist aber:

Man muß nach der Schleife:
cd>NUL

eingeben und der Errorlevel wird richtig zurückgesetzt so daß:

 IF ERRORLEVEL 1 

wie vorgesehen nur bei einem Fehler auftritt.
Biber
Biber 06.11.2017 aktualisiert um 02:15:20 Uhr
Goto Top
Moin Anmelder,

Der Errorlevel 1 kommt durch die fehlende Maskierung der Sonderzeichen in der FOR-Anweisung. Zeichen wie das Pipe-Zeichen, Kleiner, Ampersand müssen mit einem Caret innerhalb einer FOR-Klammer maskiert werden - sonst nicht.


Ausserdem kannst du ERRORLEVEL nicht löschen, weil der Wert volatil bei jeder Abfrage aus einem internen Register ermittelt wird.

Den Errorlevel über Bande wieder auf 0 zu setzen mit irgendeinem Befehl wie CD war aber die richtige Idee.

Grüße
Biber
anmelder
anmelder 06.11.2017 um 14:58:33 Uhr
Goto Top
Ja das Problem zu beheben ist die beste Lösung. Gemäß deiner Erklärung habe ich folgenden Code erstellt:

set GESAMTSICHERUNGSPFAD=c:\temp
set DATEIENDUNG=.tmp
set Partition=01
echo !Ladepfad! %Partition%

FOR /R "%GESAMTSICHERUNGSPFAD%" %%a IN (*%DATEIENDUNG%) DO (    
 ECHO %%~nxa^| findstr /b "%Partition%" ^>nul 2^>^&1 ^&^& (  
  SET "Ladepfad=%%a"  
 )
)
echo !Ladepfad! %errorlevel% ffff
Dateinamen:
01xxx.tmp
02xxx.tmp
03xxx.tmp

Ausgabe:
01xxx.tmp| findstr /b "01" >nul 2>&1 && (
02xxx.tmp| findstr /b "01" >nul 2>&1 && (
03xx.tmp| findstr /b "01" >nul 2>&1 && (
M:\03xx.tmp 0 ffff

Die Schleife wird jetzt zwar mit errorlevel 0 durchlaufen aber der ausgegebene Ladepfad ist immer die letzte Datei, es werden also keine Ergebnisse mehr gefunden. Habe ich ein Sonderzeichen übersehen?