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-Key: 353713

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: Penny.Cilin
Penny.Cilin Nov 04, 2017 at 18:42:48 (UTC)
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
Member: anmelder
anmelder Nov 04, 2017 at 19:11:46 (UTC)
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ß,
Member: Penny.Cilin
Penny.Cilin Nov 04, 2017 at 19:23:19 (UTC)
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
Member: Penny.Cilin
Penny.Cilin Nov 04, 2017 at 19:29:23 (UTC)
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
Member: rubberman
rubberman Nov 04, 2017 updated at 22:56:48 (UTC)
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
Member: anmelder
anmelder Nov 05, 2017 updated at 11:03:45 (UTC)
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.
Member: anmelder
anmelder Nov 05, 2017 at 12:34:41 (UTC)
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
Member: Penny.Cilin
Penny.Cilin Nov 05, 2017 at 12:51:41 (UTC)
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
Member: anmelder
anmelder Nov 05, 2017 updated at 13:44:13 (UTC)
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.
Member: Biber
Biber Nov 06, 2017 updated at 01:15:20 (UTC)
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
Member: anmelder
anmelder Nov 06, 2017 at 13:58:33 (UTC)
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?