2011-01-17 10 views
8

Próbuję wykonać plik wsadowy podczas zdarzenia poprzedzającego kompilację. Mam nowy projekt i dodałem do niego foo.bat. Plik zawiera następujący wiersz:Problem Wykonywanie pliku wsadowego w zdarzeniu poprzedzającym kompilację

echo bar 

Kiedy ustawić linię poleceń zdarzenia pre-build do foo.bat, pojawia się następujący błąd:

The command "foo.bat" exited with code 9009.

Kiedy ustawić pre- budowę linii poleceń zdarzeń do rozmowy foo.bat, pojawia się następujący błąd:

The command "call foo.bat" exited with code 1.

Wszystko Czytałem związane z tymi kodami ogólnie wskazuje, że występuje problem z zawartością pliku wsadowego (w tym przypadku jest to mało prawdopodobne) lub że system nie może znaleźć pliku wsadowego.

Plik wsadowy działa poprawnie z wiersza polecenia. Rzeczy, które już wypróbowałem: Utworzono plik przy użyciu różnych narzędzi, różnych kodowań, umieszczając w pliku exit 0, różne działania kompilacji dla pliku i kopiowanie pliku do katalogu wyjściowego. Wszystko bez szczęścia.

Czego mi brakuje? To musi być coś prostego.

Aktualizacja: Tak, to było proste - długość ścieżki była zbyt długa. Zobacz odpowiedź poniżej, aby uzyskać szczegółowe informacje.

Dzięki!

+0

Czy próbowałeś dać wszystkim dostęp do czytania/pisania? –

Odpowiedz

3

Wygląda jak mój problem była długością ścieżki do pliku wsadowego. Ponieważ była to dowód koncepcji I niech VS utworzyć go w domyślnej lokalizacji:

C:\Documents and Settings\UserXXX\My Documents\Visual Studio 2010\Projects\SolutionXXX\ProjectXXX\foo.bat

Jak tylko przeniósł rozwiązanie miejscu o krótszej ścieżce to działało dobrze. = P

Dzięki za sugestie!

4

Możliwe, że masz inne foo.bat gdzieś w PATH. Spróbuj podać pełną ścieżkę do pliku wsadowego, np. C:\Path\to\foo.bat.

Podczas tworzenia projektu bieżący katalog jest katalogiem z plikiem .vcproj. Ścieżka polecenia powinna być określona względem tego katalogu, jeśli nie znajduje się w PATH.

Jeszcze jedna rzecz, aby spróbować zdiagnozować problem byłoby określić cmd w poleceniu zdarzenia pre-build wyraźnie tak:

cmd /c C:\Path\to\foo.bat 

lub nawet

C:\windows\system32\cmd.exe /c C:\Path\to\foo.bat 
+1

Najpierw próbowałem '$ (SolutionDir) Scripts \ PostBuild.bat' pierwotnie, ale wtedy dało to kod błędu 9009. Kiedy użyłem' cmd $ (SolutionDir) Scripts \ PostBuild.bat' to zadziałało dla mnie, dzięki! Mój test pliku nietoperza zawierał pojedynczą linię 'exit 0' nie ma innej białej przestrzeni. – HodlDwon

+0

Przepraszam, to tak naprawdę nie działało, wysłałem odpowiedź poniżej, 'cmd' po prostu nie pokazuje błędu ... ale także nie uruchomił pliku wsadowego – HodlDwon

1

1) zobacz szczegóły błędu przez View => Wyjście 2) spróbuj nazwać "$ (SolutionDir) \ xx \ xx.bat"

1

I rozwiązać problem tworząc plik .bat z Eksploratora Windows, a następnie z kolei włącza go do mojego projektu, zamiast tworzyć bezpośrednio w VS 2010.

+0

Jaka była różnica? –

10

Mam to działa, a ja obraz jest wart tysiąca słów, więc tutaj jest pełna konfiguracja na jednym zrzucie ekranu.

enter image description here

+0

CD do katalogu plików wsadowych jest to, co naprawia to tutaj dla mnie ... kiedy bezpośrednio zadzwonię "c: \ mydirectory \ mybatch.bat" to nie działa, ale cd do "c: \ mydirectory", a następnie wywołanie "mybatch.bat" działa ... dzięki! –

+0

To działało idealnie ze mną! – Homam

-2

prawym przyciskiem myszy projekt -> wybierz Właściwości -> wybierz wydarzenie build Tab następnie usuń Gotowy komentarz wydarzenie linie.

+1

To nie * naprawia * problemu z próbą wykonania partii, prawda? Po prostu eliminuje przyczynę. – SlapY

1

Bieżący katalog roboczy zdarzeń pre-build i post-build to katalog wyjściowy określony przez makro $ (OutDir), a nie katalog projektu.

następujące tagi w "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets" określić następująco:

<Target 
    Name="PreBuildEvent" 
    Condition="'$(PreBuildEvent)'!=''" 
    DependsOnTargets="$(PreBuildEventDependsOn)"> 

    <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" /> 
</Target> 

<Target 
    Name="PostBuildEvent" 
    Condition="'$(PostBuildEvent)' != '' and ('$(RunPostBuildEvent)' != 'OnOutputUpdated' or '$(_AssemblyTimestampBeforeCompile)' != '$(_AssemblyTimestampAfterCompile)')" 
    DependsOnTargets="$(PostBuildEventDependsOn)"> 

    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" /> 
</Target> 
0

problem Podejrzewam, że tam jest spacja w ścieżce folderu.

Więc to polecenie będzie prawdopodobnie pracować dla c:\development\projectABC\foo.bat ale nie dla c:\development\project ABC\foo.bat

Przynajmniej to był problem dla mnie, nie może być inne kwestie, ale podejrzewam, że jest to najbardziej powszechne. Rozwiązanie: umieść obok siebie numer zapytania:

"c:\development\project ABC\foo.bat" 
Powiązane problemy