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.
Der Befehl 'xcopy', den Sie verwenden, ist kein MS-DOS-Programm. Es ist ein Windows-Konsolenprogramm. –
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