2010-01-02 26 views
75

Visual Studio 2008 me permite declarar un comando y adjuntarlo al evento de creación posterior para un proyecto. Al igual que muchos desarrolladores, lo uso regularmente para copiar archivos en el directorio de salida de la aplicación.Visual Studio: ¿Varios comandos post-compilación?

Estoy trabajando en un proyecto en el que necesito copiar archivos desde dos lugares diferentes a dos destinos diferentes, todo dentro de un solo proyecto. En otras palabras, necesito invocar dos comandos xcopy diferentes del mismo evento de post-construcción. Parece que el evento posterior a la creación solo tendrá un solo comando, y que si necesito invocar varios comandos, tendré que poner los comandos en un archivo * .bat y llamarlo desde el evento posterior a la construcción.

¿Es correcto o hay una forma más simple de invocar dos comandos del evento de postconstrucción? Gracias de antemano por tu ayuda.

Respuesta

100

Puede escribir tantos comandos de compilación como lo desee. Solo sepárelos por líneas nuevas.

Aquí hay un ejemplo de uno de mis proyectos.

Post Build Event Commandline

+2

Incluir una captura de pantalla solo es útil si tiene la intención de alojarlo para siempre. – OWenJ23

+1

@ OWenJ23 ... o 'imageshack' en este caso;) –

+11

A pesar de estar en líneas separadas, mis comandos se ejecutan juntos como si estuvieran en una sola línea. – Trevor

10

Cada comando debe estar en una línea separada. Sin embargo, lo que encontré es que si se produce un error al ejecutar uno de esos comandos, falla todo el postcompilación, por lo que tendrás que probar cada comando post-build de uno en uno para depurar.

+2

"xcopy/f" mostrará el nombre completo de la fuente y el nombre del archivo, que se imprimirá antes de la falla, lo que hace que sea más fácil diagnosticar múltiples comandos xcopy que múltiples comandos de copia. – yoyo

87

Importante: Al ejecutar un archivo por lotes, debe utilizar la instrucción "call" en orden las siguientes líneas para ser ejecutados. Si no usa "call", la ejecución entra en .bat y no regresa a las siguientes líneas. Lo mismo que en el prompt de DOS.

ej .:

call MyBatch1.bat 
call MyBatch2.bat 
+4

+1 Gracias. Esto me salvó un poco de dolor que estaba experimentando. – Bernard

+0

¡Gracias! ¡Esto era exactamente lo que estaba buscando! –

+1

+1 de mí, también. Me olvidé por completo de ese detalle y estaba tirando de mi cabello. – Greg

10

Hay otra opción: puedes separar los comandos con &&. P. ej.

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Esto no es exactamente la misma que la separación con saltos de línea: con &&, si el comando anterior falló, junto commant no se ejecutará.

Separar por líneas nuevas es más fácil de leer, por lo que debería preferirlo. Sin embargo, sé al menos un caso cuando es útil &&. Es el escenario, cuando utiliza hojas de propiedades para tener diferentes pasos posteriores a la construcción en diferentes máquinas. VS 2008 no permite establecer PostBuildStep en hojas de propiedades directamente, pero puede agregar una macro de usuario con su comando y llamarlo desde la configuración principal del proyecto. Una macro es una sola línea, por lo que puede usar && para tener múltiples comandos allí.

-2

Simplemente prefija "llamar" a su secuencia de comandos por lotes. De modo que las declaraciones debajo del script por lotes también se ejecutan después de devolver la llamada del script por lotes.

call Script1.cmd 
call Script2.bat 
+5

Esta respuesta ya se dio hace 2 años. –

5

Agregando a womp 's answer:

Si tiene varias hojas de propiedades que tienen algo que hacer en el mismo evento acumulación puede hacer lo siguiente para encadenar los comandos:

%(Command) 
echo foo 

donde %(Command) se expande al valor anterior del comando.

Personalmente hago esto para todos los eventos de compilación, incluso si actualmente no tengo comandos heredados, porque esto asegura que no habrá problemas si agrego hojas de propiedades más adelante.

+0

Esto también funciona con Custom Build Step. Además, la ejecución de una instrucción de lote 'exit' en cualquier punto de la cadena provoca la interrupción de la cadena. De hecho, 'exit 1' hace que la compilación falle, mientras que' exit 0' solo aborta el paso y la compilación continúa. –

0

El enfoque sugerido por womp funciona en Visual Studio 2015/2017 (Windows), pero no funciona en Visual Studio para Mac (Vista previa), que parece ejecutar solo el primero de los comandos. El único enfoque que he encontrado trabajando en ambas versiones de Mac y Windows de Visual Studio fue encadenando 2 MSBuild comandos:

<Target Name="AfterResolveReferences"> 
<Exec Command="path\MyFirstCommand.exe -parameters" /> 
</Target> 
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" > 
<Exec Command="path\MySecondCommand.exe -parameters" /> 
</Target> 

El ejemplo anterior utiliza evento "AfterResolveReferences" pero obviamente debe trabajar para el evento PostBuild también.