thedarklord
Goto Top

Errorlevel bei xcopy ist immer 0 obwohl keine Dateien kopiert wurden

Hallo face-smile

Ich bräuchte mal ein wenig Denkanstoß für mein kurzes Batch-Synchronisierungsscript!
Erklärung zum Nutzen des Scripts:

Mit USBDLM lasse ich das Script automatisch starten, wenn ich den betreffenden USB-Stick einstecke und dieses Soll dann den Ordner auf der Platte und auf dem Stick synchronisieren. Das starten klappt auch wunderbar dank des super Dienstes USBDLM, nur das Script will nicht so richtig - ok genauergesagt ist es nur noch eine kleine Schönheitskorrektur, die Synchronisation ansich läuft auch...

Hier erstmal das Script:
@echo off

echo\
echo Synchronisiere Festplatte mit USB-Stick...
echo\
xcopy "D:\Installs\*.*" "J:\Installs\" /sdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt   
if errorlevel 1 echo\ > %temp%\synchronisieren
echo\
echo\
echo\
echo Synchronisiere Festplatte mit USB-Stick...
echo\
xcopy "J:\Installs\*.*" "D:\Installs\" /sdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt  
if errorlevel 1 echo\ > %temp%\synchronisieren
echo\
echo\
echo\
if exist %temp%\synchronisieren goto EXIT
::pause
exit

:EXIT
del %temp%\synchronisieren
exit
Gedacht ist, dass das das CMD-Fenster zugeht, wenn keine Dateien kopiert wurden, aber wenn bei einem der beiden xcopy-Befehle irgendetwas kopiert wurde, soll vor dem exit noch eine Pause sein und erst nach Tastendruck soll das CMD-Fenster geschlossen werden.

Meine Idee war es, den Errorcode von xcopy abzufragen und eine temporäre Datei zu erstellen, wenn nichts kopiert wurde. Existiert vor dem Beenden der Batch die Datei, dann diese löschen und das Script pausieren.
Soweit sogut, aber irgendwie ist der Errorlevel immer 0, ob nun etwas kopiert wurde oder nicht?! Ich hab schon gegooglet und in allen Beispielen wurde einfach der xcopy Befehl benutzt und dahinter dann ein "if errorlevel blablablubb" - bei mir ändert der sich aber nicht, ob nun was gemacht wird oder nicht...
Liegt das vielleicht an den Schaltern von xcopy, dass er bei diesen IMMER etwas macht, sprich der Errorcode immer 0 ist, auch wenn keine Dateien kopiert werden?

Hat jemand noch eine andere Idee, wie ich das "pausieren oder durchlaufen" bewerkstelligen kann?

Gruß Dark

Content-ID: 134079

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

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

bastla
bastla 21.01.2010 um 22:47:32 Uhr
Goto Top
Hallo TheDarkLord!

Hinsichtlich des Errorlevels warten wir mal besser auf Biber - aber vielleicht so:
set "P="  
xcopy "D:\Installs\*.*" "J:\Installs\" /sdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt>%temp%\Kopie.log  
for /f "delims=" %%i in (%temp%\Kopie.log) do set "Erg=%%i" & echo %%i  
if "%Erg%"=="0 Datei(en) kopiert" set "P=True"  
...
...
If not defined P pause
[Edit] Auf (hoffentlich face-wink) effizientere Version geändert - aber nur ohne "/L" ... [/Edit]

Grüße
bastla
StefanKittel
StefanKittel 21.01.2010 um 23:31:18 Uhr
Goto Top
Hallo,

sonst nimm http://www.skittel.de/software/gcopy
Nur exclude kann es noch nicht. Errorlevel aber schon.

Stefan
Biber
Biber 22.01.2010 um 00:30:30 Uhr
Goto Top
Moin TheDarkLurch,
Moin bastla und StefanKittel,

ich weiß nicht, was ihr immer an den Redmonder PraktikantInnen rumzumäkeln habt.
Wie hättet ihr denn einen XCopy-Errorlevel implementiert?

Natürlich war es so (wenn man/frau versucht, sich in den Redmonder Ablauf hineinzuversetzen)

Im Pflichtenheft für diese Aufgabe (hat ein graduierter Informatiker zusammengeharkt) steht als Vorgabe

  • Prüfe Xcopy formal auf Syntaxfehler, wenn Syntaxfehler, dann höchstes Errorlevel [also 4]
  • Wenn kein Syntaxfehler, aber absolut krasses Lowlevelproblem (physischer Plattenfehler, Hauptspeicher reicht nicht, Lesen wird verweigert) dann Errorlevel 3
  • Abbruch durch User (Strg-C gedrückt) ist dann Errorlevel 2
  • Errorlevel 1 wird dann "Keine Dateien zum Kopieren gefunden"
  • Errorlevel 0 ist "Alles prima"

In der zusammenschrotenden Ebene (ein Zimmer voll pickliger Highschool-Hängehöschen-Kids) wird umgesetzt
  • Ey, einen krassen Errorlevel, also 4 gibt es, wenn der Anwender Müll eingibt, also Syntaxfehler oder aber auch wenn er explizit eine Datei OHNE Wildcards kopieren will, die es nicht gibt (e.g. "Xcopy bla.blubb D:\temp /LSD" -->Errorlevel 4) oder wenn auf ein nicht vorhandes Ziel kopiert wird
  • Errorlevel 3 gibt es gar nicht... (Einsparung von 20%, das bringt Mitarbeiterbonus!!)
  • Errorlevel 2 bei User-Abbruch
  • Errorlevel 1, wenn Anzahl zu kopierender Dateien ungleich Anzahl Dateien im Ziel [ergo: 0 Dateien zum Kopieren gefunden und ebenfalls 0 Dateien kopiert ergibt: Anzahl ist gleich, KEIN Errorlevel 1!!
  • Errorlevel 0 ist "Alles prima"
--> Damit haben die PraktikantInnen einen Errorlevel komplett eingespart, zwei Errorlevel nach Vorgabe umgesetzt und zwei weitere kreativ erweitert.

Da das eh keiner prüft, wird auch den Kumpels am Ende der Nahrungskette, also denen, die weder Highschoolabschluss noch Hängehöschen haben und nur die Endanwender-Dokumentation erstellen müssen, eben mal die Notizzettel, die während der Teamsitzungen mitgeschrieben wurden.

Die abgetippten Teamsitzungsprotokolle zusammengerührt mit den Vorgaben des Pflichtenhefts in optisch ansprechende Form gebracht ergeben dann diesen Text aus der Windows-Offline-Hilfe:
...
Beendigungscodes bei xcopy 

In der folgenden Liste sind alle Beendigungscodes mit einer kurzen Beschreibung ihrer Bedeutung aufgeführt: 

0  Die Dateien wurden ohne Fehler kopiert.  
1  Es wurden keine zu kopierenden Dateien gefunden.  
2  Der Benutzer hat xcopy durch Drücken von STRG+C abgebrochen.  
3  Es ist ein Initialisierungsfehler aufgetreten. Es steht nicht genügend Speicherplatz auf dem Datenträger oder im Arbeitsspeicher zur Verfügung, 
Sie haben eine ungültige Laufwerkbezeichnung eingegeben oder eine unzulässige Syntax in der Befehlszeile verwendet.  
4  Beim Schreiben auf den Datenträger ist ein Fehler aufgetreten.  

Ich schwör euch, genauso hat es sich zugetragen.

Grüße
Biber
StefanKittel
StefanKittel 22.01.2010 um 00:55:22 Uhr
Goto Top
Zitat von @Biber:
ich weiß nicht, was ihr immer an den Redmonder PraktikantInnen rumzumäkeln habt.
Wie hättet ihr denn einen XCopy-Errorlevel implementiert?
So hab ichs gemacht bei GCopy:
0 Vorgang ohne Fehler
1 Fehler bei den Parametern
2 Fehler beim Kopieren
3 Abbruch durch den Benutzer
Bei der Reihenfolge habe ich mir allerdings keine Gedanken gemacht...
Keine Datei ist bei mir kein Fehler, da dies bei sync ja wirklich vorkommen kann.

Ich schwör euch, genauso hat es sich zugetragen.
*breites grinsen*
Was lutscht Du eigentlich zu dieser Zeit?
TheDarkLord
TheDarkLord 22.01.2010 um 12:17:14 Uhr
Goto Top
Hallo face-smile

Danke für die Antworten!
@ Bastla: Es funktioniert super, danke! Vielleicht hab ich es jetzt etwas umständlich geschrieben, kannst ja nochmal drüber schauen, ob es eleganter zu machen ist face-wink
Ach ja, wie kann ich die Variablen nur lokal nutzen? Irgendwas mit set local war das oder? Nur wo hin...

@echo off

set "A="  
set "B="  
echo\
echo Kopiere von Festplatte auf USB-Stick...
echo\
xcopy "D:\Installs\*.*" "J:\Installs\" /Lsdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt >%temp%\synchronisieren1.log  
for /f "delims=" %%i in (%temp%\synchronisieren1.log) do set "Erg=%%i"   
if "%Erg%"=="0 Datei(en) kopiert" set "A=True"  
xcopy "D:\Installs\*.*" "J:\Installs\" /sdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt  
echo\
echo\
echo\
echo Kopiere von USB-Stick auf Festplatte...
echo\
xcopy "J:\Installs\*.*" "D:\Installs\" /Lsdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt >%temp%\synchronisieren2.log  
for /f "delims=" %%i in (%temp%\synchronisieren2.log) do set "Erg=%%i"   
if "%Erg%"=="0 Datei(en) kopiert" set "B=True"  
xcopy "J:\Installs\*.*" "D:\Installs\" /sdyhcrv /exclude:D:\Programme\Batches\Synchronisieren-Exclude.txt  
echo\
echo\
echo\

if not defined A goto PAUSE
if not defined B goto PAUSE
exit

:PAUSE
pause
exit

Gruß Dark
bastla
bastla 22.01.2010 um 13:16:19 Uhr
Goto Top
Hallo TheDarkLord!

Das zweimalige Durchlaufen des "xcopy" ist ja eigentlich unnötig - daher die Änderungen oben, wobei ich leider vergessen hatte, den Schalter "/L" wieder zu entfernen face-sad ...
Auch das Setzen des Schalters habe ich mir nochmals überlegt - sinnvoller ist es, diesen auf "True" zu setzen, wenn nicht keine Datei (ja,ist ernst gemeint face-wink) kopiert wurde, also:
if "%Erg%" neq "0 Datei(en) kopiert" set "P=True"
Dann kannst Du auch für das zweite "xcopy" den selben Schalter verwenden (welcher Kopiervorgang das "True" gesetzt hat, unterscheidest Du ja - derzeit - ohnehin nicht und die ODER-Verknüpfung ist auch so realisiert) und im Endeffekt die letzen Zeilen (ab 25) auf
if defined P pause
reduzieren (aus ist der Batch danach ja sowieso face-wink) ...

Grüße
bastla
TheDarkLord
TheDarkLord 22.01.2010 um 13:56:52 Uhr
Goto Top
Vielen Dank für die Hilfe, Bastla face-smile