erreur "chemin d'accès non valide 0 fichiers copiés" lors de l'utilisation de la commande xcopy

Salut j'ai cette petite commande pour copier des fichiers dans un lot, ce qui aidera parce que je fais ce copier plusieurs fois par jour. Le problème survient lors de l'utilisation de la commande xcopy. Tout est en ordre, mais je reçois cette erreur:"chemin 0 invalides fichiers copiés". Voici le code:

C:WindowsSystem32xcopy  /Y "C:UsersRyanDesktopmmars_pub" "C:UsersRyanDesktopDropboxMMARSmmars_pub"

j'utilise le chemin complet de l'exécutable xcopy parce que j'avais du mal à configurer la variable d'environnement path pour qu'elle fonctionne correctement. J'imagine que ça ne devrait pas affecter le résultat cependant. J'ai lu quelque part à propos de la case à cocher "empêcher les programmes basés sur MS-DOS de détecter Windows" qui devrait corriger le problème, mais je ne semble pas pouvoir trouver cela. Toute aide appréciée.

14
demandé sur Ross Ridge 2014-09-15 08:31:49

1 réponses

réponse originale

supprimer le antislash final du chemin du dossier source

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

modifié 2015/10/01

alors que la question originale utilisait un chemin littéral, et que la solution indiquée résoudrait le problème, il y a une autre option. Pour les chemins littéraux et dans les cas où le chemin est à l'intérieur d'une variable et pourrait (ou non) se terminer par un antislash, il suffit de s'assurer que la fin backslash (si présent) est séparé de la citation, y compris un point de fin.

xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"

ce point final n'interférera pas dans les noms de fichiers/dossiers. S'il y en a un et qu'il se termine par antislash, le point supplémentaire se référera simplement au même dossier. S'il n'y a pas de fin de antislash comme dans les fichiers windows et les dossiers ne peuvent pas terminer leurs noms avec un point, il sera éliminé.

mais si la sortie du xcopy commande sera traitée, n'oubliez pas que ce point supplémentaire sera être inclus dans le chemin.


remarque:: Les solutions sont au-dessus de la ligne. Continuez à lire s'il est intéressé par pourquoi / où il y a un problème.

Pourquoi xcopy "c:\source\" "d:\target\" échoue, mais xcopy "c:\source" "d:\target\" fonctionne?

les deux commandes semblent avoir des références de chemin valides, et ... Oui! les deux sont des références de chemin valides, mais il y a deux éléments qui fonctionnent ensemble pour faire échouer la commande:

  • le dossier la référence est citée (note: il devrait être cité, est une bonne habitude de citer des chemins que vous ne savez jamais quand ils vont contenir d'espaces ou de caractères spéciaux)
  • xcopy n'est pas une commande interne gérée par cmd mais un fichier exécutable

xcopy est une commande externe, ses arguments ne sont pas traités suivant le cmd analyser la logique de la ligne de commande. Elles sont gérées par l' Microsoft C code de démarrage.

cet analyseur suit deux séries de règles, les règles officielles

  • les Arguments sont séparés par un espace blanc, qui est un espace ou une tabulation.

  • une chaîne entourée de guillemets doubles est interprétée comme un seul argument, quel que soit l'espace blanc qu'elle contient. Une cité la chaîne peut être intégré dans un argument. Notez que le signe (^) n'est pas reconnu comme un personnage d'évasion ou délimiteur.

  • un double guillemet précédé d'un antislash, \", est interprété comme un littéral guillemet double (").

  • les tirets inversés sont interprétés littéralement, à moins qu'ils ne précèdent immédiatement un double guillemet.

  • si un nombre pair d'antislashs est suivi d'un double guillemet, alors un antislash (\) est placé dans le tableau argv pour chaque paire de les barres obliques inverses (\), et les guillemets (") interprété comme un délimiteur de chaîne.

  • si un nombre impair de antislashes est suivi d'un double guillemet, alors un antislash (\) est placé dans le tableau argv pour chaque paire de barres obliques inverses (\) et le double guillemet est interprété comme une séquence d'évasion par le backslash restant, provoquant une guillemet double (") à placer dans argv.

et sans-papiers/non règlement officiel (Comment Les Paramètres De La Ligne De Commande Sont Analysés)

  • à L'extérieur D'un bloc double a " commence un bloc double Cité.
  • à l'Intérieur d'un double cité bloc " suivi d'un autre caractère (pas un autre ") termine le bloc double Cité.
  • à l'Intérieur d'un double cité bloc " suivi immédiatement par un autre "(i.e. "") provoque un " à ajouter à la sortie, et le le bloc à double cotation continue.

Cet analyseur voit la séquence \" trouvé à la fin de l' "premier" argument comme une citation échappée qui ne finit pas / ferme l'argument, il est considéré comme une partie ou l'argument. Et le "démarrage" citation "deuxième" l'argument ne fait que mettre fin au bloc double cité mais pas en terminant l'argument, rappelez-vous que les arguments sont délimités par l'espace blanc.

alors pendant qu'il semble que les arguments de la ligne de commande sont

     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\

l'argument réel manipulé par xcopy

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

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

lorsque le antislash de fin est enlevé ou le point supplémentaire inclus, la citation de clôture dans l'argument ne sera pas échappée, il fermera le bloc cité et l'espace entre les arguments sera considéré comme un délimiteur.

55
répondu MC ND 2015-10-05 05:46:56