2011-03-03 82 views
59

Estoy usando XCOPY en un evento posterior a la compilación para copiar las DLL compiladas de sus carpetas de salida a la carpeta de salida de la aplicación principal. Los archivos DLL se copian en una subcarpeta "Módulos" en la carpeta principal de salida de aplicación, así:XCOPY ¿cambiar para crear el directorio especificado si no existe?

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

El comando funciona bien si existe la carpeta de módulos, pero he descubierto durante las pruebas que si la carpeta doesn' t existe, XCOPY no lo crea y el comando falla.

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

+0

ver mi comentario a la aceptada respuesta –

Respuesta

40

yo probamos este en la línea de comandos usando

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

y el directorio de destino se creó correctamente.

Si no se puede crear el directorio de destino mediante el comando mkdir con cmd 'extensiones de comando s habilitado como

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

('/x' permite a las extensiones de comando en caso de que no están habilitadas por defecto en su sistema, no estoy tan familiarizado con cmd)

uso

cmd /? 
mkdir /? 
xcopy /? 

para más infor mación :)

+10

Acepté esta respuesta porque la primera parte resultó ser correcta. XCOPY * * creará el directorio, si aún no existe. Descubrí que Windows intentaba solicitar la confirmación de sobrescritura en mi comando XCOPY. VS no permite eso, por lo que salió con el Código 2. Agregué el/y param, que suprime el mensaje, y el comando funciona. Probado limpiando la solución y eliminando la carpeta, luego reconstruyendo. La carpeta fue creada por XCOPY. –

+0

@DavidVeeneman Esto no funciona en VS2015 en Windows 10; xcopy errores con el mensaje "error: ruta no válida". Entonces no xcopy _will Not_ (siempre) a crear el directorio de destino –

+1

xcopy crear el directorio, pero sólo lo hará si no hay ambigüedad: Esta es ambigua: D: \> xcopy myfile.dat xcopytest \ test Este no es: D: \> xcopy myfile.dat xcopytest \ test \ (tenga en cuenta el último '\') – azog

0

Try/E

Para obtener una lista completa de opciones: xcopy /?

+0

Gracias , pero/e es para copiar una estructura de subdirectorio existente en la fuente. Estoy copiando un archivo en la raíz de origen a un nuevo subdirectorio en el destino. –

13

Odio el paso PostBuild, permite que sucedan demasiadas cosas fuera del ámbito de la herramienta de compilación. Creo que es mejor dejar que MSBuild administre el proceso de copia y actualice. Puede editar el archivo .csproj así:

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

Creo que sus entradas, archivos de origen y archivos de destino no son correctos. Está copiando el DDL en la carpeta de módulos, y no al revés. –

+0

Ahh gracias. Corregido –

+0

Los agregaría a un grupo de propiedades de todos modos. –

6

Usted podría utilizar Robocopy:

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

+1: No sabía sobre el comando robocopy disponible en Vista y Win7. Gracias. Sin embargo, no creas que funcionará aquí. Estoy copiando un archivo, en lugar de una carpeta. –

+0

Yo tampoco sabía sobre robocopy. Es bueno saberlo, pero lamentablemente falla con el mensaje "Acceso denegado" si se está copiando en una carpeta en Archivos de programa. (xcopy no tiene ningún problema con esto.) –

+0

Tras un estudio posterior, parece que xcopy puede contentar copiar nuevos archivos en carpetas existentes en Archivos de programa, pero aparentemente tampoco puede crear nuevas carpetas (sin acceso de administrador) . –

14

Use el parámetro/i con xcopy y si el directorio no existe se creará el directorio de tú.

96

Responder al uso "/ I" funciona, pero con un pequeño truco: en el objetivo, debe terminar con el carácter \ para decirle a xcopy que el objetivo es el directorio y no el archivo.

Ejemplo:

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

no funciona y el código 2 volver, pero éste:

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

de comando argumentos de línea utilizado en mi muestra:

/F - Muestra fuente completo & nombres de archivos de destino

/R - Esto sobrescribirá la lectura- Sólo los archivos

/Y - Suprime el mensaje para sobrescribir un archivo existente (s)

/I - asume que el destino es el directorio (pero imprescindible termina con \)

+3

La respuesta debería ser más útil si fue elaborada por qué usar '/ F', por qué'/R', why '/ Y'. En mi caso, '/ Y' resolvió el problema y los futuros lectores se beneficiarían de saber por qué sin la minería de datos en Internet. –

+0

¿Qué sucede si necesito crear dos directorios? ¿Puedo hacer una copia para mí? – Pedro77

+3

http://www.computerhope.com/xcopyhlp.htm. Esto ayuda con los comandos. – Roylee

Cuestiones relacionadas