Batch-Datei und DEL errorlevel 0 Problem
Dem Stapel zu entfernen, Dateien und Verzeichnisse von bestimmten Orten und Ausgang Erfolg oder stdout/stderr-Nachrichten, um eine neue .txt-Datei. Ich habe die meisten das Skript und führt es genau so, wie es sollte, außer, wenn das löschen erfolgreich ist, bewegt sich vorwärts zur nächsten Zeile, vielmehr als echo einer "erfolgreich" Meldung auf dem Protokoll.
echo Basic Deletion Batch Script > results.txt
@echo off
call :filelog >> results.txt 2>&1
notepad results.txt
exit /b
:filelog
call :delete new.txt
call :delete newer.txt
call :delete newest.txt
call :remove c:\NoSuchDirectory
GOTO :EOF
:delete
echo deleting %1
del /f /q c:\Users\newuser\Desktop\%1
if errorlevel 0 echo succesful
GOTO :EOF
:remove
echo deleting directory %1
rmdir /q /s %1
GOTO :EOF
Aus irgendeinem Grund kann ich nicht finden, die syntax für die if-del erfolgreich echo 'erfolgreich'. In dem obigen Beispiel, wenn ich die Zeile entfernen
if errorlevel 0 echo successful
Alles funktioniert gut, aber keine Erfolgsmeldung. Mit dieser Zeile Links in Echos Erfolg für jede Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
del
undErrorLevel
?Den
del
Befehl nicht dieErrorLevel
solange die angegebenen Parameter gültig sind, wird es sogar resetet dieErrorLevel
zu0
in solchen Fällen (zumindest für Windows 7).del
ändert dieErrorLevel
nur im Fall, dass eine ungültige Option angegeben wird (del /X
setztErrorLevel
zu1
), werden keine Argumente angegeben, werden alle (del
setztErrorLevel
zu1
auch), oder einen falschen Datei-Pfad angegeben ist (del :
setztErrorLevel
zu123
), zumindest für Windows 7.Möglich Zu Arbeiten, Um
Ein möglicher work-around ist das erfassen der
STDERR
Ausgabe vondel
, weil im Falle der Löschung von Fehlern, die damit verbundenen Meldungen (Could Not Find [...]
,Access is denied.
,The process cannot access the file because it is being used by another process.
) sind geschrieben. Eine solche Aussehen könnte:Verwenden Sie den code in der Eingabeaufforderung direkt, anstatt in eine batch-Datei schreiben
%#
statt%%#
.Wenn Sie nicht wollen, zu löschen, nur-lese-Dateien, entfernen Sie
/F
von derdel
Befehlszeile;wenn Sie möchten, dass die Ansagen (im Falle von Platzhaltern
?
- und/oder*
vorhanden sind, in den Pfad der Datei), entfernen/Q
.Erklärung von Code
Dieser führt den Befehl aus Zeile
del /F /Q "\path\to\the\file_s.txt"
. Durch den Teil2>&1 1> nul
, die Ausgabe des Befehls anSTDOUT
entlassen werden, und seineSTDERR
Ausgabe umgeleitet werden, so dassfor /F
erhält.Wenn der Löschvorgang erfolgreich war,
del
erzeugt keineSTDERR
Ausgang, daher derfor /F
Schleife nicht Durchlaufen, da gibt es nichts zu analysieren. Beachten Sie, dassErrorLevel
wird nicht zurückgesetzt in dem Fall, sein Wert bleibt unverändert.Wenn
for /F
erhält jederSTDERR
Ausgabe vomdel
Befehlszeile-der Befehl in der Schleife ausgeführt wird, dieset =
; dies ist eine ungültige syntax, daherset
legt dieErrorLevel
zu1
. Die2> nul
Teil vermeidet die NachrichtThe syntax of the command is incorrect.
angezeigt werden.Um die
ErrorLevel
explizit Sie können auchcmd /C exit /B 1
. Vielleicht diese Zeile besser lesbar. Für sicher, es ist mehr flexibel, denn Sie können jede (vorzeichenbehaftete 32-bit) Zahl, einschließlich0
um es zu deaktivieren (das weglassen der Nummer löscht Sie auch). Vielleicht ist es ein bisschen schlimmer in Bezug auf Leistung, obwohl.Anwendungsbeispiel
Folgende batch-Datei zeigt, wie Sie die oben beschriebene Problemumgehung angewendet werden könnte:
Voreinstellung
ErrorLevel
Neben den oben genannten Befehl
cmd /C exit /B
können Sie auch> nul ver
zum zurücksetzen derErrorLevel
. Dies kann kombiniert werden mit derfor /F
Schleife arbeiten-etwa wie diese:Alternative Methode Ohne
for /F
Anstatt
for /F
zu erfassen, dieSTDERR
Ausgabe vondel
, diefind
- Befehl kann auch benutzt werden, wiefind /V ""
gibt eineErrorLevel
von1
wenn ein leerer string kommt und in1
ansonsten:Jedoch, dies würde die Rückkehr eine
ErrorLevel
von1
im Fall, dass die Löschung erfolgreich war und die0
wenn nicht. Umkehren, das Verhalten, eineif
/else
Klausel könnte angefügt werden, wie diese:Wenn Sie die Verwendung dieser syntax, statt diese
können Sie diese - weil errorlevel 0 ist immer wahr.
Verwenden Sie einfach
rm
aus UnxUtils (oder gow oder cygwin). Es setzt den errorlevel korrekt, im Falle einer nicht vorhandenen Datei, oder alle Fehler löschen der Datei.rm
setzt errorlevel auf eine nicht vorhandene Datei, währenddel
nicht.Soviel ich mich erinnern kann die korrekte syntax ist:
Dass die Prozent-Zeichen sind ein Hinweis auf check environment-Variablen.
Dies wurde Hinzugefügt als edit von dem ursprünglichen Fragesteller, ich baute es zu einem community-wiki zu beantworten, denn es sollte eine Antwort sein, nicht Bearbeiten.
Fand ich heraus, wie es zu tun... eine Art und Weise sowieso.
IF ERRORLEVEL 0 [cmd] wird ausgeführt, jedes mal, weil WENN ERRORLEVEL # prüft, ob der Wert von ERRORLEVEL größer als oder gleich #. Deshalb, jeder Fehler-code wird die Ausführung von [cmd].
Eine gute Referenz für diese ist: http://www.robvanderwoude.com/errorlevel.php
Ich würde empfehlen, ändern Sie Ihren code so etwas wie die folgenden:
Wenn Sie etwas brauchen, dass Prozesse mehr als einen ERRORLEVEL, Sie könnte so etwas tun:
ODER
Die Antwort von aschipfl ist Super (danke, hat mir sehr geholfen!) mit dem code unter Voreinstellung ErrorLevel bekommen Sie eine schöne standard-Funktion:
Achten Sie auf
%~1
statt%1
imdel
- Anweisung, oder Sie erhalten Fehler, wenn Sie eine zitiert mit dem Namen.BTW 1: Sie können eine nette Fehlermeldung als zweiten parameter
BTW 2: Mit
::
stattREM
für Kommentare macht den code auch leichter lesbar.