xcopy post-build-event

XCOPY cambiar para crear el directorio especificado si no existe?



post-build-event (7)

Estoy usando XCOPY en un evento posterior a la compilación para copiar archivos DLL compilados desde sus carpetas de salida a la carpeta de salida de la aplicación principal. Las DLL se están copiando a una subcarpeta "Módulos" en la carpeta de salida principal de la aplicación, como esto:

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

El comando funciona bien si la carpeta Módulos existe, pero durante la prueba descubrí que si la carpeta no existe, XCOPY no la crea y el comando falla.

¿Hay un interruptor XCOPY que hará que la carpeta se cree si no existe? Si no, ¿qué agregaría a mi evento posterior a la compilación para crear la carpeta si no existe? Gracias por tu ayuda.


Intenté esto en el comando. Está funcionando para mí.

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


Intenté esto en la línea de comandos usando

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

y el directorio de destino fue creado correctamente.

Si no, puede crear el directorio de destino utilizando el comando mkdir con las extensiones de comando de cmd habilitadas como

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

(''/ x'' habilita las extensiones de comando en caso de que no estén habilitadas de forma predeterminada en su sistema, no estoy tan familiarizado con cmd )

utilizar

cmd /? mkdir /? xcopy /?

para mayor información :)


La respuesta para usar "/ I" está funcionando pero con un pequeño truco: en target debe terminar con el carácter / para decirle a xcopy que target es directorio y no archivo.

Ejemplo:

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

No funciona y devuelve el código 2, pero este:

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

Argumentos de línea de comando utilizados en mi muestra:

/ F - Muestra los nombres completos de los archivos de origen y destino

/ R - Esto sobrescribirá los archivos de sólo lectura

/ Y: suprime las indicaciones para sobrescribir un archivo (s) existente

/ I: supone que el destino es el directorio (pero debe terminar con /)


Odio el paso de PostBuild, permite que ocurran demasiadas cosas fuera del alcance de la herramienta de construcción. Creo que es mejor dejar que MSBuild administre el proceso de copia y haga la actualización. Puedes editar el archivo .csproj así:

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


Podrías usar robocopy:

robocopy "$(TargetPath)" "$(SolutionDir)Prism4Demo.Shell/$(OutDir)Modules" /E


Probar / E

Para obtener una lista completa de opciones: xcopy /?


Use el / i con xcopy y si el directorio no existe, creará el directorio por usted.