2014-09-15 3 views
12

Hallo Ich habe diesen kleinen Befehl, um Dateien in einem Batch zu kopieren, was helfen wird, weil ich diese spezifische Kopie mehrmals am Tag mache. Das Problem tritt bei Verwendung des Xcopy-Befehls auf. Alles ist in Ordnung, aber ich erhalte diesen Fehler: "Ungültiger Pfad 0 Dateien kopiert". Hier ist der Code:"ungültiger Pfad 0 Dateien kopiert" Fehler bei der Verwendung von xcopy Befehl

C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\" 

ich den vollständigen Pfad zum xcopy ausführbaren bin mit, weil ich Probleme, den Pfad Umgebungsvariable Konfiguration richtig funktionieren. Ich könnte mir vorstellen, dass es das Ergebnis nicht beeinflussen sollte. Ich habe irgendwo über das Kontrollkästchen "MS-DOS-basierte Programme zum Erkennen von Windows verhindern" nachgelesen, das das Problem beheben sollte, aber ich kann es einfach nicht finden. Jede Hilfe wird geschätzt.

+0

Der Befehl 'xcopy', den Sie verwenden, ist kein MS-DOS-Programm. Es ist ein Windows-Konsolenprogramm. –

+0

Die Variable% path% ist standardmäßig so eingestellt, dass sie die korrekten Ordner verwendet. Wenn Sie die 'path'-Variable erneut verwendet haben, wählen Sie einen anderen Variablennamen. Dies betrifft nur die Art und Weise, wie Sie den vollständigen Pfad zum 'xcopy'-Befehl einstellen müssen. – foxidrive

Antwort

46

Ursprüngliche Antwort

Entfernen Sie den Backslash aus dem Quellordner Pfad

C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\" 

bearbeitet 2015/10/01

Während die ursprüngliche Frage wörtlich verwendet Pfad, und die angezeigte Lösung wird das Problem lösen, gibt es eine andere Option . Bei literalen Pfaden und in Fällen, in denen der Pfad innerhalb einer Variablen liegt und mit einem umgekehrten Schrägstrich enden kann (oder nicht), reicht es aus, dass der abschließende umgekehrte Schrägstrich (falls vorhanden) vom Anführungszeichen getrennt ist, einschließlich eines Endpunkts.

Dieser Endpunkt beeinträchtigt nicht die Namen von Dateien/Ordnern. Wenn es einen umgekehrten Schrägstrich gibt und endet, verweist der zusätzliche Punkt einfach auf denselben Ordner. Wenn der Backslash nicht endet, wie in Windows-Dateien und Ordner können ihre Namen nicht mit einem Punkt enden, wird es verworfen.

ABER wenn die Ausgabe des Befehls xcopy verarbeitet wird, denken Sie daran, dass dieser zusätzliche Punkt in den angezeigten Pfaden enthalten sein wird.


Anmerkung: Die Lösungen oberhalb der Linie sind. Lesen Sie weiter, wenn Sie interessiert sind, warum/wo es ein Problem gibt.

Warum xcopy "c:\source\" "d:\target\" schlägt fehl aber xcopy "c:\source" "d:\target\" funktioniert?

Beide Befehle scheinen gültige Pfadreferenzen zu haben und ... YES! beide sind gültige Pfad Referenzen, aber es gibt zwei Elemente, die zusammen den Befehl funktionieren nicht:

  • der Ordner Referenz zitiert wird (Anmerkung: Es sollte zitiert werden, eine gute Gewohnheit ist, wie Sie zu zitieren Pfade nie wissen, wann sie Leer- oder Sonderzeichen enthalten)
  • xcopy ist kein interner Befehl behandelt durch cmd sondern eine ausführbare Datei

Als xcopy ist ein externer Befehl, werden seine Argumente nicht nach dembehandeltParser-Befehlszeilenlogik. Sie werden von der Microsoft C startup code behandelt.

Dieser Parser folgt zwei Sätze von Regeln, amtliche Vorschriften

  • Arguments are delimited by white space, which is either a space or a tab.

  • A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. Note that the caret (^) is not recognized as an escape character or delimiter.

  • A double quotation mark preceded by a backslash, \" , is interpreted as a literal double quotation mark (").

  • Backslashes are interpreted literally, unless they immediately precede a double quotation mark.

  • If an even number of backslashes is followed by a double quotation mark, then one backslash (\) is placed in the argv array for every pair of backslashes (\\), and the double quotation mark (") is interpreted as a string delimiter.

  • If an odd number of backslashes is followed by a double quotation mark, then one backslash (\) is placed in the argv array for every pair of backslashes (\\) and the double quotation mark is interpreted as an escape sequence by the remaining backslash, causing a literal double quotation mark (") to be placed in argv.

und nicht dokumentierte/nicht amtlichen Regeln (How Command Line Parameters Are Parsed)

  • Outside a double quoted block a " starts a double quoted block.
  • Inside a double quoted block a " followed by a different character (not another ") ends the double quoted block.
  • Inside a double quoted block a " followed immediately by another " (i.e. "") causes a single " to be added to the output, and the double quoted block continues.

Dieser Parser sieht die Sequenz \" am Ende des gefunden "first" Argument als ein maskiertes Zitat, das nicht endet/schließt das Argument, es wird als Teil oder das Argument gesehen. Und die "Start" Zitat der "zweite" Argument ist nur die Doppel-quote Block beenden, aber nicht das Argument zu beenden, daran erinnern, dass die Argumente durch Leerraum begrenzt sind.

So, während es scheint, dass die Befehlszeilenargumente

 v   v   v......argument delimiters 
     v.........v v..........v ......quoted blocks 
xcopy "x:\souce\" "x:\target\" 
     ^.......^ ^........^ ......argument data 
     arg #1  arg #2 

     arg #1 = x:\source\ 
     arg #2 = x:\target\ 

das eigentliche Argument von xcopy behandelt sind, ist

 v      v .....argument delimiters 
     v......................v .....quoted block 
xcopy "x:\souce\" "x:\target\" 
     ^.....................^ .....argument data 
     arg #1  

     arg #1 = x:\source" x:\target" 

Wenn der Backslash entfernt wird oder der zusätzliche Punkt enthalten, die Das Schließen von Anführungszeichen im Argument wird nicht maskiert, es schließt den in Anführungszeichen gesetzten Block und der Abstand zwischen den Argumenten wird als Trennzeichen betrachtet.

Verwandte Themen