web-dev-qa-db-fra.com

"Fichiers chemin non valide copiés" Erreur 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 cette copie spécifique plusieurs fois par jour. Le problème se produit lors de l'utilisation de la commande xcopy. Tout est en ordre, mais je reçois cette erreur: "Chemin invalide 0 fichiers copiés". Voici le code:

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

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

19
frontin

Réponse originale

Supprimer la barre oblique inverse de fin 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\"

édité 2015/10/01

Bien que la question d'origine ait utilisé un chemin littéral et que la solution indiquée résoudra le problème, il existe 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 une barre oblique inverse, il suffit de s'assurer que la barre oblique inverse de fin (si présente) est séparée de la citation, y compris un point de fin.

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

Ce point de fin n'interférera pas dans les noms de fichiers/dossiers. S'il y a une barre oblique inverse et une fin, le point supplémentaire se référera simplement au même dossier. S'il n'y a pas de barre oblique inverse comme dans Windows, les fichiers et les dossiers ne peuvent pas terminer leur nom par un point, il sera supprimé.

MAIS si la sortie de la commande xcopy sera traitée, n'oubliez pas que ce point supplémentaire sera inclus dans les chemins indiqués.


note : Les solutions sont au-dessus de la ligne. Continuez à lire si vous êtes intéressé par pourquoi/où il y a un problème.

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

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:

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

Comme xcopy est une commande externe, ses arguments ne sont pas traités selon la logique de la ligne de commande de l'analyseur cmd. Ils sont gérés par le code de démarrage Microsoft C .

Cet analyseur suit deux ensembles de règles, les règles officielles

  • Les arguments sont délimités par un espace blanc, qui est soit un espace soit une tabulation.

  • Une chaîne entourée de guillemets doubles est interprétée comme un seul argument, quel que soit l'espace blanc contenu à l'intérieur. Une chaîne entre guillemets peut être incorporée dans un argument. Notez que le signe d'insertion (^) n'est pas reconnu comme caractère d'échappement ou délimiteur.

  • Un guillemet double précédé d'une barre oblique inversée, \", est interprété comme un guillemet double littéral (").

  • Les barres obliques inverses sont interprétées littéralement, sauf si elles précèdent immédiatement un guillemet double.

  • Si un nombre pair de barres obliques inverses est suivi d'un guillemet double, une barre oblique inverse (\) est placé dans le tableau argv pour chaque paire de barres obliques inverses (\\) et le guillemet double (") est interprété comme un délimiteur de chaîne.

  • Si un nombre impair de barres obliques inverses est suivi d'un guillemet double, une barre oblique inversée (\) est placé dans le tableau argv pour chaque paire de barres obliques inverses (\\) et le guillemet double est interprété comme une séquence d'échappement par la barre oblique inverse restante, provoquant un guillemet double littéral (") à placer dans argv.

et les règles non documentées/non officielles ( Comment les paramètres de ligne de commande sont analysés )

  • En dehors d'un bloc entre guillemets doubles, un " démarre un bloc entre guillemets doubles.
  • À l'intérieur d'un bloc entre guillemets doubles, un " suivi d'un caractère différent (pas un autre ") termine le bloc entre guillemets.
  • À l'intérieur d'un bloc entre guillemets doubles, un " suivi immédiatement d'un autre " (c'est à dire. "") provoque un seul " à ajouter à la sortie et le bloc entre guillemets continue.

Cet analyseur voit la séquence \" trouvé à la fin de l'argument "premier" comme une citation échappée qui ne termine pas/ne ferme pas l'argument, il est considéré comme une partie ou l'argument. Et l'argument "commençant" de l'argument "deuxième" termine simplement le bloc entre guillemets MAIS ne termine pas l'argument, rappelez-vous que les arguments sont délimités par du blanc espace.

Donc, alors 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 géré par xcopy est

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

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

Lorsque la barre oblique inverse de fin est supprimée ou le point supplémentaire inclus, le guillemet de fermeture dans l'argument ne sera pas échappé, il fermera le bloc cité et l'espace entre les arguments sera considéré comme un délimiteur.

60
MC ND