2010-01-02 25 views
75

Visual Studio 2008 consente di dichiarare un comando e collegarlo all'evento post-generazione per un progetto. Come molti sviluppatori, lo uso regolarmente per i file xcopy nella directory di output dell'applicazione.Visual Studio: più comandi post-compilazione?

Sto lavorando a un progetto in cui ho bisogno di xcopy di file da due luoghi diversi a due destinazioni diverse, tutto all'interno di un singolo progetto. In altre parole, ho bisogno di invocare due diversi comandi xcopy dallo stesso evento post-build. Sembra che l'evento post-build prenderà solo un singolo comando e che se avrò bisogno di invocare comandi multipli, dovrò mettere i comandi in un file * .bat e chiamarlo dall'evento post-build.

È corretto oppure esiste un modo più semplice per richiamare due comandi dall'evento post-build? Grazie in anticipo per il vostro aiuto.

risposta

100

È possibile digitare tutti i comandi di post generazione desiderati. Basta separarli con i newline.

Ecco un esempio di uno dei miei progetti.

Post Build Event Commandline

+2

L'inclusione di una schermata è utile solo se si intende ospitarla per sempre. – OWenJ23

+1

@ OWenJ23 ... o 'imageshack' in questo caso;) –

+11

Pur essendo su linee separate, i miei comandi vengono eseguiti insieme come se fossero su una singola riga. – Trevor

10

Ogni comando deve essere su una linea separata. Quello che ho trovato è che se c'è un errore nell'esecuzione di uno di questi comandi l'intera post-generazione fallisce e quindi è necessario provare ogni comando post-build uno alla volta per eseguire il debug.

+2

"xcopy/f" mostrerà il nome completo del file di origine e di destinazione, che verrà stampato prima dell'errore, rendendo più facili da diagnosticare più comandi di xcopy rispetto a più comandi di copia. – yoyo

87

Importante: quando si esegue un file batch, è necessario utilizzare l'istruzione "call" per ordinare le seguenti righe da eseguire. Se non usi "call", l'esecuzione va nel .bat e non ritorna alle righe seguenti. Come sul prompt di DOS.

es .:

call MyBatch1.bat 
call MyBatch2.bat 
+4

+1 Grazie. Questo mi ha salvato un dolore che stavo vivendo. – Bernard

+0

Grazie !!! Questo era esattamente quello che stavo cercando! –

+1

+1 anche da parte mia. Completamente dimenticato di quel dettaglio e mi stava strappando i capelli. – Greg

10

c'è un'altra opzione: è possibile separare i comandi con &&. E.g.

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

Questo non è esattamente la stessa di separazione con ritorni a capo: con &&, se il comando precedente non è riuscita, la prossima comandate non verrà eseguito.

Separare da newline è più facile da leggere, quindi è preferibile. Tuttavia, conosco almeno un caso in cui è utile &&. È lo scenario, quando si utilizzano le finestre delle proprietà per avere diversi passaggi post-compilazione su macchine diverse. VS 2008 non consente di impostare PostBuildStep direttamente nelle finestre delle proprietà, ma è possibile aggiungere una macro utente con il comando e richiamarla dalle impostazioni principali del progetto. Una macro è a riga singola, quindi puoi usare && per avere più comandi lì.

-2

Basta prefisso "call" al tuo script batch. Pertanto, anche le istruzioni sotto lo script Batch vengono eseguite dopo aver restituito la chiamata dallo script batch.

call Script1.cmd 
call Script2.bat 
+5

Questa risposta è stata data già 2 anni fa. –

5

Aggiungendo a womp s' answer:

Se si dispone di più fogli di proprietà con qualcosa da fare sullo stesso evento di compilazione è possibile effettuare le seguenti operazioni per catena di comandi:

%(Command) 
echo foo 

dove %(Command) si espande al valore precedente del comando.

Personalmente lo faccio per tutti gli eventi di costruzione, anche se attualmente non ho comandi ereditati, perché questo garantisce che non ci saranno problemi se aggiungo i fogli delle proprietà in seguito.

+0

Funziona anche con il passo di creazione personalizzata. Inoltre, l'esecuzione di un'istruzione batch 'exit' in qualsiasi punto lungo la catena provoca l'interruzione della catena. Infatti, "exit 1" fa fallire la build mentre "exit 0" interrompe il passo e la build continua. –

0

L'approccio suggerito da womp funziona in Visual Studio 2015/2017 (Windows), ma non funziona in Visual Studio per Mac (Anteprima), che sembra eseguire solo il primo dei comandi. L'unico approccio che ho trovato a lavorare in entrambe le versioni Mac e Windows di Visual Studio è stato incatena 2 comandi MSBuild:

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

L'esempio precedente utilizza evento "AfterResolveReferences", ma, ovviamente, dovrebbe funzionare per evento Postbuild troppo.

Problemi correlati