Mit Visual Studio 2008 kann ich einen Befehl deklarieren und an das Post-Build-Ereignis für ein Projekt anhängen. Wie viele Entwickler verwende ich es regelmäßig, um Dateien in das Ausgabeverzeichnis der Anwendung zu kopieren.
Ich arbeite an einem Projekt, bei dem ich Dateien von zwei verschiedenen Orten zu zwei verschiedenen Zielen kopieren muss, alle innerhalb eines einzigen Projekts. Mit anderen Worten, ich muss zwei verschiedene xcopy-Befehle aus demselben Post-Build-Ereignis aufrufen. Es sieht so aus, als würde das Post-Build-Ereignis nur einen einzigen Befehl annehmen. Wenn ich mehrere Befehle aufrufen muss, muss ich die Befehle in eine * .bat-Datei einfügen und diese vom Post-Build-Ereignis aus aufrufen.
Ist das richtig oder gibt es eine einfachere Möglichkeit, zwei Befehle aus dem Post-Build-Ereignis aufzurufen? Vielen Dank im Voraus für Ihre Hilfe.
quelle
Wichtig: Wenn Sie eine Batchdatei ausführen, müssen Sie die Anweisung "call" verwenden, um die folgenden Zeilen auszuführen. Wenn Sie "call" nicht verwenden, geht die Ausführung in die .bat und kehrt nicht zu den folgenden Zeilen zurück. Gleich wie bei der DOS-Eingabeaufforderung.
z.B:
quelle
Es gibt noch eine andere Option: Sie können die Befehle mit trennen
&&
. Z.Bcopy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2
Dies ist nicht genau das Gleiche wie das Trennen mit Zeilenumbrüchen:
&&
Wenn der vorherige Befehl fehlgeschlagen ist, wird der nächste Kommant nicht ausgeführt.Das Trennen durch Zeilenumbrüche ist einfacher zu lesen, daher sollten Sie es vorziehen. Ich kenne jedoch mindestens einen Fall, in dem dies
&&
nützlich ist. Dies ist das Szenario, wenn Sie Eigenschaftenblätter verwenden, um verschiedene Schritte nach dem Erstellen auf verschiedenen Computern auszuführen. In VS 2008 können Sie PostBuildStep nicht direkt in Eigenschaftenblättern festlegen. Sie können jedoch mit Ihrem Befehl ein Benutzermakro hinzufügen und es über die Hauptprojekteinstellungen aufrufen. Ein Makro besteht aus einer einzelnen Zeile, sodass Sie&&
dort mehrere Befehle verwenden können.quelle
Jeder Befehl sollte in einer separaten Zeile stehen. Was ich jedoch festgestellt habe, ist, dass bei einem Fehler beim Ausführen eines dieser Befehle der gesamte Post-Build fehlschlägt und Sie daher jeden Post-Build-Befehl einzeln ausprobieren müssen, um das Debugging durchzuführen.
quelle
Trennen der Befehle mit & oder && oder; funktioniert nicht in VS2017. Ich kann nicht glauben, dass solch einfache Funktionen in VS2017 nicht verfügbar sind. Visual Studio versucht, den gesamten Text im Ereignisfenster nach dem Erstellen als eine Zeichenfolge auszuführen. Die einzige Möglichkeit für mich ist jetzt, ein Batch-Skript zu erstellen, das mir nicht besonders gefällt.
quelle
Zusätzlich zu womp ‚s Antwort :
Wenn Sie mehrere Eigenschaftenblätter haben, die für dasselbe Build-Ereignis etwas zu tun haben, können Sie die Befehle wie folgt verketten:
Dabei wird
%(Command)
auf den vorherigen Wert des Befehls erweitert.Persönlich mache ich dies für alle Build-Ereignisse, auch wenn ich derzeit keine geerbten Befehle habe, da dies sicherstellt, dass es keine Probleme gibt, wenn ich später Eigenschaftenblätter hinzufüge.
quelle
exit
Batch-Anweisung an einer beliebigen Stelle entlang der Kette ausführen , wird die Kette abgebrochen. Inexit 1
der Tat schlägt der Build fehl, währendexit 0
der Schritt nur abgebrochen wird und der Build fortgesetzt wird.In Visual Studio 2017 können Sie Folgendes tun:
quelle
Der von womp vorgeschlagene Ansatz funktioniert in Visual Studio 2015/2017 (Windows), jedoch nicht in Visual Studio für Mac (Vorschau), das nur den ersten Befehl auszuführen scheint. Der einzige Ansatz, den ich sowohl in Mac- als auch in Windows-Versionen von Visual Studio gefunden habe, war die Verkettung von zwei MSBuild-Befehlen:
Das obige Beispiel verwendet das Ereignis "AfterResolveReferences", sollte aber natürlich auch für das PostBuild-Ereignis funktionieren.
quelle
Es gibt keine gute Lösung für dieses Problem. Die Aufrufidee führt dazu, dass andere Skripte ausgeführt werden. Ich habe festgestellt, dass die Fehlererkennung nicht funktioniert. Fügen Sie 'exit / b 1' in FailMe.cmd ein. Verwenden Sie 'call FailMe.cmd' in den Schritten nach dem Erstellen. Beachten Sie, dass der Build nicht fehlschlägt? Ich verwende VS 2017, um ein C # -Projekt zu erstellen. Versuchen Sie es jetzt mit 'FailMe.cmd'. Der Build meldet jetzt einen Fehler.
Daher ist es möglicherweise besser, nur ein einziges Skript zu verwenden, wenn die Fehlerberichterstattung wichtig ist.
quelle
Stellen Sie Ihrem Batch-Skript einfach das Präfix "call" voran. Damit werden Anweisungen unter dem Batch-Skript auch ausgeführt, nachdem der Aufruf vom Batch-Skript zurückgegeben wurde.
quelle