Copie de commande terminée avec le code 4 lors de la construction - Visual Studio restart le résout
De temps en temps, lorsque je construis ma solution ici (avec 7 projets), je reçois l'erreur redoutée 'Command copy exited with code 4', Dans Visual Studio 2010 Premium ed.
Cela est dû au fait que l'événement post-build ne peut pas passer.
Voici ce qui résout le problème, temporairement
- parfois: un redémarrage de Visual Studio et je suis capable de construire la solution
- parfois: à la fois un redémarrage de Visual Studio et mon gestionnaire de fichiers de choix (Q-Dir 4.37) elle n'en résout.
Voici à quoi ressemble l'événement post-build:
xcopy "$(SolutionDir)Solution ItemsReferences*.dll" "$(TargetDir)" /Y
Lorsque vous obtenez la copie de commande terminée avec l'erreur code [insert value], c'est normalement à cause de ce qui suit:
- autorisations de lecture / écriture
- fichiers manquants
- mauvais répertoires
Cependant-évidemment, à des moments où je construis la solution, il n'y a pas de problème.
POUR INFO, j'ai désinstallé ReSharper 5.1.1 il y a deux semaines et Visual Studio m'a donné quelques erreurs depuis lors (parmi eux ne pas être en mesure de déboguer). J'ai réinstallé Visual Studio et cela fonctionne mieux depuis lors, mais j'ai toujours ce problème. Cela pourrait-il avoir à voir avec des choses ReSharper étant quelque part?
Avez-vous eu le même problème et la résolu? Ou avez-vous une solution possible pour elle?
Acclamations.
25 réponses
J'ai invariablement trouvé que c'était un problème de verrouillage de fichier. Code 4 est impossible D'accéder au fichier. Une solution partielle que j'ai trouvée est d'utiliser l'option / C pour xcopy (qui continue en cas d'erreur). Pas vraiment une solution mais surtout cela a empêché mes builds d'échouer.
Une autre solution qui ne fonctionne que sur 32 bits consiste à utiliser l'Outil unlocker pour libérer les handles windows sur le fichier avant la copie.
Edit: je viens de réaliser que cela fonctionne aussi sous 64 bits.
Alors que /C
peut ignorer les erreurs, ce n'est peut-être pas la vraie solution car il peut y avoir des fichiers qui doivent être copiés pour que la construction réussisse.
Le problème le plus courant est les guillemets manquants autour des balises de commande prédéfinies (telles que $TargetDir
). Quand on crée diverses branches et chemins dans le code ou TFS, il y a une très grande chance que cela se produise.
Parfois, si le fichier est en lecture seule, cela causera également des problèmes. Ajoutez l'option /R
pour autoriser les fichiers en lecture seule copié. Vous pouvez trouver la liste des options disponibles à:
Http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true
Un autre problème possible est que le dossier sous-jacent n'est pas accessible. Si c'est le cas, essayez d'exécuter "start xcopy"
au lieu de "xcopy"
. Cela ouvrira une autre fenêtre de commande mais avec admin priveleges.
J'ai traversé la même erreur, mais c'est pas parce que le fichier est verrouillé, mais le fichier est manquant.
La raison pour laquelle VS a essayé de copier un fichier non existant est due à la commande d'événement Post-build.
Après avoir effacé cela, Problème résolu.
Mise à jour:
Comme @ rhughes a commenté:
Le vrai problème est de savoir comment faire fonctionner la commande ici, plutôt que de le supprimer.
Et il a absolument raison.
Dans le cas où l'événement post build contient la commande copy/xcopy pour copier la sortie de build dans un répertoire(qui est généralement l'opération post build la plus courante), le problème peut se produire dans le cas où le chemin de répertoire complet des destinations source ou cible contient des noms de dossiers qui incluent des espaces. Supprimez l'espace pour le(s) nom (s) de répertoire et essayez.
J'ai également fait face à ce problème.Vérifiez le résultat dans la fenêtre d'erreur.
Dans mon cas, un tailing \
plantait xcopy (comme j'utilisais $(TargetDir)
). Dans mon cas $(SolutionDir)..\bin
. Si vous utilisez une autre sortie, cela doit être ajusté.
Notez Également que start xcopy
ne pas le fixer, si l'erreur a disparu après la compilation. Il a peut-être juste été supprimé par la ligne de commande et aucun fichier n'a été copié!
Vous pouvez exécuter manuellement vos commandes xcopy dans une commande Shell. Vous obtiendrez plus de détails lors de leur exécution là-bas, vous pointant dans la bonne direction.
Comme mentionné dans de nombreux sites, il y a plusieurs raisons à cela. Pour moi, c'était dû à la longueur de la Source et de la Destination (longueur du chemin). J'ai essayé xcopy dans l'invite de commande et j'ai été incapable de taper la source complète et le chemin (après quelques caractères, il ne vous permettra pas de taper). J'ai ensuite réduit la longueur du chemin et j'ai pu courir. Espérons que cette aide.
J'ai eu cette erreur parce que le compte d'utilisateur sous lequel le service de construction TFS s'exécutait n'avait pas les autorisations d'écrire dans le dossier de destination. Right-click on the folder-->Properties-->Security
.
Exécutez VS en mode Administrateur et cela devrait fonctionner correctement.
Cela peut se produire dans plusieurs cas:
- lorsque le chemin de chaîne complet est plus long que 254 caractères.
- Lorsque le nom du fichier à copier est mauvais.
- lorsque le chemin cible est incorrect.
- Lorsque l'attribut readonly est défini sur le fichier copié ou le dossier cible.
J'ai eu cette erreur parce que le fichier a été ouvert dans une autre instance.
Quand j'ai fermé le fichier et reconstruit à nouveau la solution, il a été copié avec succès.
J'ai rencontré le même problème en cas de XCOPY après la construction. Dans mon cas, le problème se produisait en raison des autorisations en lecture seule définies sur les dossiers.
J'ai ajouté la commande attrib-R avant XCOPY et cela a résolu le problème.
J'espère que ça aide quelqu'un!
J'ai eu la même erreur avec xcopy en relation avec le moteur de Test. J'utilise VisualStudio Professional 2013. Par défaut Test - > paramètres de Test - > garder le moteur D'exécution de Test en cours d'exécution semble être la raison de mon code d'erreur 4 avec xcopy. Éteindre résolu le problème. Le moteur d'exécution semble garder sur certains .DLL.
J'ai eu le même problème. Une simple "Solution propre" dans VS a effacé l'erreur, mais c'était une solution temporaire.
J'ai trouvé que la définition du paramètre Copy To output Directory du fichier pour copier semble toujours avoir résolu le problème de verrouillage. Bien que maintenant j'ai 2 copies des fichiers et besoin d'en supprimer un.
J'ai eu le même problème. Cependant, rien n'a fonctionné pour moi. J'ai résolu le problème en ajoutant
exit 0
À mon code. Le problème était que pendant que je faisais la copie des fichiers, parfois le dernier fichier ne pouvait pas être trouvé, et la chauve-souris renvoyait une valeur non nulle.
J'espère que cela aide quelqu'un!
J'ai fait face au même problème. J'ai supprimé les événements post-build et cela a commencé à fonctionner. Parfois, lorsque nous ajoutons des composants SQL, il peut également ajouter des commandes post build.
J'obtiens quelque chose de similaire en utilisant une xcopy avec l'option / exclude. Dans mon cas, j'ai trouvé que l'édition de l'événement post-build (quelque chose d'inoffensif comme un retour à la ligne après la commande)et l'enregistrement du projet provoquent l'erreur. La réenregistrement du fichier spécifié dans l'option / exclude le fait fonctionner à nouveau.
Comme j'écris une bibliothèque DLL, j'ai utilisé la commande xcopy pour copier la bibliothèque où le programme peut le trouver et le charger. Après plusieurs fois d'ouverture et de fermeture du programme, il y avait encore un processus ouvert dans taskmanager que je n'ai pas reconnu.
Recherchez tout processus à partir duquel le fichier peut être utilisé et fermez-le.
Qu'est-ce qui l'a réparé pour moi : creusez jusqu'à la solution spécifique pour le projet que vous voulez, c'est-à-dire pas le fichier de solution globale pour tous les projets.
Essayez-j'ai essayé tout le reste mentionné ici mais en vain.
Je ne vois rien ici pour suggérer qu'il s'agit d'une application web, mais j'ai moi-même rencontré ce problème - j'ai deux commandes xcopy sur un événement post-build et une seule d'entre elles échouait. Quelque chose avait un verrou sur le fichier, et ce n'était pas Visual Studio (comme j'ai essayé de le redémarrer.)
La seule autre chose qui aurait utilisé la dll que j'ai construite était IIS. Et voilà,
Un simple iisreset
a fait l'affaire pour moi.
J'ai eu le même problème. Cela a été causé par le fait d'avoir le même drapeau deux fois, par exemple:
Si $(ConfigurationName) == Libération (xcopy "$(TargetDir)." "$(SolutionDir)Déploiement\$(ProjectName)\" /e /d /e /y /e)
Observez que le drapeau "/ e " apparaît deux fois. La suppression du doublon a résolu le problème.
Dans mon cas, mon $(OutDir)
était simplement ..\..\Build\
c'est-à-dire un chemin relatif. Et, quand j'essayais de xcopy comme suit
xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\"
je recevais l'erreur de code de sortie 4.
Ce qui se passe, c'est que cette commande était exécutée dans le $(OutDir) (dans mon cas dossier de construction) lui-même et non dans le répertoire où se trouvait le fichier csproj du projet (comme on s'y attendrait normalement). Par conséquent, j'ai continué à obtenir l'erreur File not found
(correspondant au code de sortie 4).
Je ne pouvais pas comprendre cela avant d'écrire cd
dans les événements Post Build, pour imprimer dans quel répertoire cela était exécuté.
Donc, pour résumer, si nous voulons copy
/ xcopy
les fichiers du $(OutDir)
, utilisez "$(TargetDir)"
(qui est un chemin complet pour le répertoire de sortie) ou n'ont pas besoin de spécifier de chemin du tout.
Peut être causé par VMWare Workstation avec des dossiers partagés
J'ai toujours le problème lorsque le dossier destinatinon du xcopy
est également mappé en tant que dossier partagé dans une machine virtuelle.
Je l'ai résolu avec un script s'exécutant dans la machine virtuelle et supprimant le contenu du dossier partagé.
Pour développer la réponse rhughes,
Le robocopy fonctionne magnifiquement, juste au cas où vous devez inclure des sous-répertoires que vous pouvez utiliser /e
pour inclure des sous-répertoires et copier des répertoires vides ou /s
pour inclure des sous-répertoires à l'exclusion des répertoires vides.
Robocopy rapportera également quelques choses comme si de nouveaux fichiers ont été copiés, cela provoquera une plainte de VS car tout ce qui est supérieur à 0 est un échec et robocopy retournera 1 si de nouveaux fichiers ont été trouvés. Il vaut la peine de mentionner que robocopy premier compare la Source / Dest et ne copie que les fichiers mis à jour/nouveaux.
Pour contourner cette utilisation:
(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0