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.