Visual Studio: wiele poleceń po kompilacji?

102

Visual Studio 2008 pozwala mi zadeklarować polecenie i dołączyć je do zdarzenia po kompilacji projektu. Podobnie jak wielu programistów, używam go regularnie do kopiowania plików do katalogu wyjściowego aplikacji.

Pracuję nad projektem, w którym muszę skopiować pliki z dwóch różnych miejsc do dwóch różnych miejsc docelowych, a wszystko to w ramach jednego projektu. Innymi słowy, muszę wywołać dwa różne polecenia xcopy z tego samego zdarzenia po kompilacji. Wygląda na to, że zdarzenie po kompilacji zajmie tylko jedno polecenie, a jeśli będę musiał wywołać wiele poleceń, będę musiał umieścić polecenia w pliku * .bat i wywołać to ze zdarzenia po kompilacji.

Czy to prawda, czy jest prostszy sposób wywołania dwóch poleceń ze zdarzenia po kompilacji? Z góry dziękuje za twoją pomoc.

David Veeneman
źródło

Odpowiedzi:

126

Możesz wpisać dowolną liczbę poleceń po kompilacji. Po prostu oddziel je nowymi liniami.

Oto przykład z jednego z moich projektów.

Linia poleceń po kompilacji wydarzenia

womp
źródło
3
Dołączenie zrzutu ekranu jest przydatne tylko wtedy, gdy zamierzasz go hostować na zawsze.
Amandalishus
1
@ OWenJ23 ... lub 'imageshack' w tym przypadku;)
Anthony Walsh
29
Pomimo tego, że znajduję się w osobnych wierszach, moje polecenia są wykonywane razem, jakby znajdowały się w jednym wierszu.
Trevor
6
Niestety wydaje się, że przynajmniej VS2015 nie zgłasza błędu, jeśli jedno z poleceń pośrednich zawodzi ... zgłasza wynik ostatniego polecenia jako wynik kroku po kompilacji.
Johannes S.
3
Wygląda na to, że działa to z poziomu programu Visual Studio - ale nie jest obsługiwane, jeśli używasz MsBuild na maszynie do kompilacji TFS. MsBuild usuwa podziały wierszy, a następnie nie wykonuje polecenia z powodu złej składni.
Jeff B
107

Ważne: Podczas wykonywania pliku wsadowego należy użyć instrukcji „call” w celu wykonania następujących wierszy. Jeśli nie użyjesz "call", wykonanie przejdzie do .bat i nie wróci do następnych linii. To samo, co w przypadku zachęty DOS.

na przykład:

call MyBatch1.bat
call MyBatch2.bat
huha
źródło
3
Ta wskazówka dotyczy poleceń grunt i npm, ponieważ oba uruchamiają pliki wsadowe (grunt.cmd i npm.cmd).
Matt Varblow
16

Jest jeszcze jedna opcja: możesz oddzielić polecenia za pomocą &&. Na przykład

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

To nie jest dokładnie to samo, co oddzielanie &&znakami nowej linii: za pomocą , jeśli poprzednie polecenie zawiodło, następny komenda nie zostanie uruchomiony.

Oddzielanie znakami nowej linii jest łatwiejsze do odczytania, więc powinieneś je preferować. Jednak znam przynajmniej jeden przypadek, kiedy &&jest przydatny. Jest to scenariusz, w którym używasz arkuszy właściwości do wykonywania różnych kroków po kompilacji na różnych komputerach. VS 2008 nie pozwala na ustawienie PostBuildStep bezpośrednio w arkuszach właściwości, ale możesz dodać makro użytkownika za pomocą polecenia i wywołać je z głównych ustawień projektu. Makro jest w jednym wierszu, więc możesz użyć &&wielu poleceń.

Rumak
źródło
11

Każde polecenie powinno znajdować się w osobnym wierszu. Odkryłem jednak, że jeśli wystąpi błąd podczas wykonywania jednego z tych poleceń, cała post-kompilacja zawiedzie, a więc będziesz musiał wypróbować każde polecenie po kompilacji pojedynczo, aby debugować.

Lisa
źródło
2
"xcopy / f" pokaże pełną nazwę pliku źródłowego i docelowego, która zostanie wydrukowana przed błędem, dzięki czemu wiele poleceń xcopy będzie łatwiejszych do zdiagnozowania niż wiele poleceń kopiowania.
jojo
9

Oddzielanie poleceń za pomocą & lub && lub; nie działa w VS2017. Nie mogę uwierzyć, że tak prosta funkcjonalność nie jest dostępna w VS2017. Program Visual Studio próbuje wykonać cały tekst w oknie zdarzenia po kompilacji jako jeden ciąg. Jedyną opcją dla mnie jest teraz stworzenie skryptu wsadowego, którego nie lubię specjalnie.

Indra
źródło
1
Oddzielanie poleceń za pomocą && działa dla mnie w VS2017. Określanie każdego polecenia w osobnym wierszu w edytorze VS2017 nie działa dla mnie.
Codesniffer
5

Dodając do womp jest odpowiedź :

Jeśli masz wiele arkuszy właściwości z czymś do zrobienia w ramach tego samego zdarzenia kompilacji, możesz wykonać następujące czynności, aby połączyć polecenia:

%(Command)
echo foo

gdzie %(Command)rozwija się do poprzedniej wartości polecenia.

Osobiście robię to dla wszystkich zdarzeń kompilacji, nawet jeśli obecnie nie mam dziedziczonych poleceń, ponieważ zapewnia to, że nie będzie problemów, jeśli później dodam arkusze właściwości.

Max Truxa
źródło
1
Działa to również z krokiem budowania niestandardowego. Ponadto wykonanie exitinstrukcji wsadowej w dowolnym miejscu łańcucha powoduje przerwanie łańcucha. Rzeczywiście exit 1powoduje niepowodzenie kompilacji, podczas gdy exit 0po prostu przerywa krok i jest kontynuowana.
Martin Connell
3

W programie Visual Studio 2017 możesz to zrobić:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>
Jonathan Weesner
źródło
1
Edytowałem plik .csproj i dodałem <Command> </Command> wokół moich dwóch poleceń zdarzenia postbuild. To nie wydawało się działać. Kiedy spojrzałem na zdarzenia kompilacji w programie Visual Studio, miałem <Command> </Command> wokół dwóch poleceń, ale podał błąd kompilacji: polecenie „<Command xmlns =" ​​.. "> polecenie1 polecenie2 </Command>" wyszedł z kodem 255.
Jimmy
2

Podejście sugerowane przez womp działa w Visual Studio 2015/2017 (Windows), ale nie działa w Visual Studio dla komputerów Mac (wersja zapoznawcza), który wydaje się wykonywać tylko pierwsze z poleceń. Jedynym podejściem, które znalazłem działającym w wersjach Visual Studio na komputery Mac i Windows, było połączenie w łańcuch 2 poleceń MSBuild:

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

Powyższy przykład używa zdarzenia „AfterResolveReferences”, ale oczywiście powinien działać również dla zdarzenia PostBuild.

Crulex
źródło
1

Nie ma dobrego rozwiązania tego problemu. Idea wywołania powoduje uruchomienie innych skryptów. Zauważyłem, że wykrywanie błędów nie działa. Umieść 'exit / b 1' w FailMe.cmd Użyj 'call FailMe.cmd' w krokach po kompilacji. Zauważ, że kompilacja nie zawodzi? Korzystam z VS 2017 budowania projektu C #. Teraz spróbuj z „FailMe.cmd”. Kompilacja teraz zgłasza błąd.

Więc lepiej byłoby, gdybyś użył tylko jednego skryptu, jeśli raportowanie błędów jest ważne.

Richard Meadows
źródło
-4

Po prostu wpisz przedrostek „call” do swojego skryptu wsadowego. Tak więc instrukcje poniżej skryptu Batch są również wykonywane po zwróceniu wywołania ze skryptu wsadowego.

call Script1.cmd
call Script2.bat
msKing
źródło