Kann ein `errorlevel 1` von` xcopy` unter Windows 10 abgerufen werden?

1243
MC ND

Die Microsoft- Dokumentation gibt an, dass es sich bei den xcopyExit-Codes handelt

Exit code Description 0 Files were copied without error. 1 No files were found to copy. 2 The user pressed CTRL+C to terminate xcopy. 4 Initialization error occurred.  There is not enough memory or disk space,  or you entered an invalid drive name  or invalid syntax on the command line. 5 Disk write error occurred. 

Ich bin ein Windows 10 64 - Bit - System (spanisch locale), und ich habe alles versucht, mir zu bekommen, ein einfiel errorlevel 1aus xcopy, aber ich habe nicht in der Lage gewesen. Und mit allem, was ich meine, war das einzige, was ich nicht getestet habe, /Nlange Dateinamen in einer Quelle, in denen kurze Namen nicht aktiviert sind (in meiner Umgebung kann ich es nicht testen). Die üblichen Verdächtigen nicht passenden Platzhalter, nicht vorhanden Dateinamen, leere Ordner, /D, /EXCLUDE, /A, /M, /U, ... getestet wurden.

Ich sollte zwar einfach sein (keine Dateien gefunden?, Einfach), aber ich habe mich geirrt, das war nicht der Fall, also habe ich debugiert xcopy.exeund das ist, was ich gesehen habe:

  • xcopyverwendet intern eine Methode, die aufgerufen DisplayMessageAndExit(messageID, WSTRING, exitCode)wird, um eine Nachricht anzuzeigen und zu beenden. Es verwendet auch mehrere exitAufrufe, um das Programm in einigen Fällen zu verlassen (Bsp. Ctrl-C)

  • Ich habe keinen exitAufruf gefunden, der einen Wert von verwenden könnte1

  • Aus der Liste der Anrufe, an die ein Anruf getätigt wurde, DisplayMessageAndExitwird kein Wert 1als Beendigungscode übergeben.

  • DisplayMessageAndExitVerwenden Sie aus der Liste der Anrufe, an die nur einer von ihnen getätigt wurde, die MessageID 0x5622(in meiner Installation befinden sich die zugeordneten Ressourcen in C:\Windows\System32\es-ES\ulib.dll.muiAbhängigkeit vom Gebietsschema), d. H. No se encuentra el archivo: %1( File not found - %1), Und der Exit-Code, der beim Aufruf verwendet wird4

Vielleicht gibt es eine Möglichkeit xcopy, den 1Exit-Code zu generieren, aber ich weiß nicht wie.

Die Frage ist also: Gibt es eine Möglichkeit, den errorlevel 1Exit-Code zu erhalten xcopy? Was vermisse ich?

4
Ich würde es erwarten, wenn Sie `/ d` verwenden und keine Dateien neuer sind. AFH vor 7 Jahren 0
@AFH Nein. `/ d` tut es nicht. DavidPostill vor 7 Jahren 0
@DavidPostill - Entschuldigung, ich hatte keine Zeit zu prüfen. Ich habe gesagt, ich würde es erwarten, und ich habe das Gefühl, dass es sollte. AFH vor 7 Jahren 0
@AFH Sie haben Recht, es sollte (es gibt '0' zurück). Ich habe "xcopy foo bar" ausprobiert, wobei "foo" nicht existiert und dies auch nicht getan hat (es gibt "4" zurück). DavidPostill vor 7 Jahren 0
@DavidPostill, Wie ich es sehe, gibt es zwei Möglichkeiten: Es ist unmöglich oder es ist etwas so offensichtliches, dass ich es nicht sehe. Aber all das, obwohl ich offensichtlich war, hat nicht funktioniert. MC ND vor 7 Jahren 0
@DavidPostill - Die einzigen anderen Möglichkeiten, die ich mir vorstellen kann, die zurückgegeben werden sollen, sind das Kopieren eines leeren Verzeichnisses oder die Verwendung einer Dateimaske hat keine Übereinstimmungen. AFH vor 7 Jahren 0
@MCND - Wie Sie habe ich alles versucht, was ich mir vorstellen kann, ohne irgendetwas zu finden, das 1 zurückgibt. Es sieht sehr nach einem langjährigen Fehler aus. Das Beste, was Sie tun können, ist `xcopy ...>% temp% \ xcopy.tmp`; Wenn der Rückkehrcode 0 ist, verwenden Sie `findstr / l" 0 Datei (en) kopiert "<% temp% \ xcopy.tmp`, um zu prüfen, ob keine Dateien kopiert wurden. Seien Sie nicht in der Versuchung, zu irgendetwas zu pfeifen: Wenn Sie zum Beispiel "tee" leiten, erhalten Sie den Rückgabecode, der mit "tee" festgelegt wurde, nicht von "xcopy". AFH vor 7 Jahren 0
@AFH, nach dem Testen war ich zu 80% sicher, dass es sich um einen Fehler handelt. Nach dem Debuggen von "xcopy" war ich zu 99,9% sicher, dass es sich um einen Fehler handelt, aber ich hätte etwas übersehen können, das jemand anderes kennt. Ja, ich weiß, wie mit den 0-Datei (en) und dem Pipe-Verhalten umzugehen ist, aber in diesem Fall interessiere ich mich nur für das Exit-Code-Verhalten. Trotzdem danke ich Ihnen für Ihre Tests. MC ND vor 7 Jahren 0
Ich vermute, dass sie in Microsoft _ es wissen. Es gibt ein Beispiel 'COPYIT.BAT` unter dem angegebenen Link _to perform_ `xcopy` _operationen und verwendet den batch_` if` _command, um den Exit-Code zu verarbeiten, wenn ein Fehler auftritt _. Der Stapel kümmert sich überhaupt nicht um `errorlevel 1` und verarbeitet nur die Erhöhungsstufen 4, 2 und 0 (_it kein Fehler, es ist ein Feature_?) JosefZ vor 7 Jahren 2
@JosefZ, danke, ich habe die Batch-Datei vermisst (das Rendern in einer Zeile hilft nicht). Es scheint, dass die, die es schreiben, nicht wirklich wissen, wie `errorlevel` funktioniert. "if errorlevel 0" gilt immer für nicht negative errorlevel-Werte und "xcopy" dokumentiert keine negativen Werte. Es scheint * die Absicht * zu sein, einen Fallthrough in das folgende Label zu verwenden, um den 'errorlevel 1'-Fall zu behandeln, aber wie gesagt, der Code ist falsch. MC ND vor 7 Jahren 0
Ich denke, dass "if errorlevel 0 goto exit" folgendes ": lowmemory" -Label überspringen soll (bitte beachten Sie das "if errorlevel 4 goto lowmemory"). Errorlevel wird ordnungsgemäß in absteigender Reihenfolge getestet. Fehlende Überprüfung von "if errorlevel 1" ist mehr Interessantes für mich aus Sicht Ihrer Frage. JosefZ vor 7 Jahren 0
@JosefZ, um `: lowmemory` zu überspringen, brauchst du nur einen` goto`, nicht einen `if errorlevel 0`, der in diesem Szenario immer wahr ist. Warum ein "wenn" verwenden? Es ist nur meine Meinung, aber für mich scheint es ein (falscher) Durchschlag zu sein, wie in C `switch` -Anweisung. Natürlich weiß ich nicht warum, und ich könnte (wieder) falsch liegen. In jedem Fall, ja, Ihr Punkt führt zu einer verdächtigen Auslassung in ihrem Code. MC ND vor 7 Jahren 2

2 Antworten auf die Frage

0
WeaponGod243

Um einen errorlevel1 zu erhalten, denke ich, Sie können nur eine Dateiquelle haben, die dort nicht vorhanden ist.

Wie bereits erwähnt, wurde dies getestet und nein, es wird kein "Errorlevel 1" generiert MC ND vor 6 Jahren 0
Probieren Sie diese Site aus: https://ss64.com/nt/ WeaponGod243 vor 6 Jahren 0
0
BeowulfNode42

Das Einzige, woran ich denken kann, ist eine Art Rassenbedingung: Zwischen dem Kopieren der Liste der Dateien durch xcopy und dem Kopieren der Dateien löscht oder verschiebt ein anderer Prozess die Dateien.

Wenn Sie einen Fehler 1 erhalten können, wenn nur einige der Quelldateien fehlen, kann dies möglicherweise absichtlich geschehen. Die einzige Möglichkeit, die ich absichtlich tun kann, ist, zwei oder mehr separate Prozesse auszuführen, einen xcopy- und einen Lösch- oder Verschiebungsbefehl, die alle die gleichen Quelldateien ausführen. Sie benötigen eine Quelle mit vielen Dateien, um den konkurrierenden Prozessen Zeit zu geben, sich gegenseitig zu überholen.

  1. Starten Sie einen Move-, Del- oder Robocopy / Mov-Befehl in einem Ordner, in dem sich viele Dateien befinden.
  2. in einem anderen Fenster und lange bevor der erste Befehl beendet ist, starten Sie den Befehl xcopy

Wenn Sie die Option / C nicht angeben, kann dies bedeuten, dass xcopy versucht, die erste Datei abzubrechen, ohne dass eine Datei kopiert wird, und die Bedingung der kopierten NO-Dateien erfüllt.

Guter Versuch, aber nein. Um nicht auf eine Kollision warten zu müssen, habe ich direkt vor dem Dateikopiervorgang einen Haltepunkt im `xcopy`-Programm eingefügt, und wenn er erreicht ist, habe ich die zu kopierende Datei gelöscht. Beim Fortsetzen der ausführbaren Datei 'xcopy' erhalte ich Fehlercode 4. MC ND vor 6 Jahren 1