web-dev-qa-db-fra.com

Commutateur XCOPY pour créer le répertoire spécifié s'il n'existe pas?

J'utilise XCOPY dans un événement post-build pour copier les DLL compilées de leurs dossiers de sortie dans le dossier de sortie de l'application principale. Les DLL sont copiées dans un sous-dossier "Modules" dans le dossier de sortie principal de l'application, comme suit:

xcopy  "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\" 

La commande fonctionne correctement si le dossier Modules existe, mais j’ai découvert au cours des tests que si ce dossier n’existait pas, XCOPY ne le créait pas et que la commande échouait.

Existe-t-il un commutateur XCOPY qui entraînera la création du dossier s’il n’existe pas? Si non, qu'est-ce que j'ajouterais à mon événement post-build pour créer le dossier s'il n'existe pas? Merci de votre aide.

72
David Veeneman

J'ai essayé ceci en ligne de commande en utilisant

D:\>xcopy myfile.dat xcopytest\test\

et le répertoire cible a été créé correctement.

Sinon, vous pouvez créer le répertoire cible en utilisant la commande mkdir avec les extensions de commande de cmd activées comme

cmd /x /c mkdir "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\"

('/ x' active les extensions de commande si elles ne sont pas activées par défaut sur votre système, je ne connais pas très bien cmd)

utilisation

cmd /? 
mkdir /?
xcopy /?

pour plus d'informations :)

46
MartinStettner

La réponse à utiliser "/ I" fonctionne mais avec peu de ruse dans la cible, vous devez terminer par\pour que xcopy sache que la cible est un répertoire et non un fichier!

Exemple:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder" /F /R /Y /I

ne fonctionne pas et renvoie le code 2, mais celui-ci:

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)_DropFolder\" /F /R /Y /I

Arguments de ligne de commande utilisés dans mon exemple:

/ F - Affiche les noms de fichiers source et cible complets

/ R - Cela écrasera les fichiers en lecture seule

/ Y - Supprime l'invite à écraser un fichier existant

/ I - Suppose que la destination est un répertoire (mais doit se terminer par \)

111
psulek

Je déteste l’étape PostBuild, elle permet à trop de choses de se produire en dehors du domaine de l’outil de compilation. Je pense qu'il est préférable de laisser MSBuild gérer le processus de copie et effectuer la mise à jour. Vous pouvez éditer le fichier .csproj comme ceci:

  <Target Name="AfterBuild" Inputs="$(TargetPath)\**">
    <Copy SourceFiles="$(TargetPath)\**" DestinationFiles="$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules\**" OverwriteReadOnlyFiles="true"></Copy>
  </Target>
15
Ritch Melton

Utilisez le/i avec xcopy et si le répertoire n’existe pas, il le créera pour vous.

14
GeekyGuy

Vous pouvez utiliser robocopy:

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell\$(OutDir)Modules" /E
6
John Simons

J'ai essayé ceci sur la commande.il travaille pour moi.

if "$(OutDir)"=="bin\Debug\"  goto Visual
:TFSBuild
goto exit
:Visual
xcopy /y "$(TargetPath)$(TargetName).dll" "$(ProjectDir)..\Demo"
xcopy /y "$(TargetDir)$(TargetName).pdb" "$(ProjectDir)..\Demo"
goto exit
:exit
1
Ankit Mori

Essayez/E

Pour obtenir une liste complète des options: xcopy /?

0
Steve Wellens

La réponse courte simple est la suivante:

xcopy /Y /I "$(SolutionDir)<my-src-path>" "$(SolutionDir)<my-dst-path>\"
0
zezba9000