2015-01-22 67 views
5

Jak mogę wyświetlić dane wyjściowe polecenia systemowego. Ex:Wyświetlanie wyjściowe wywołania system() w C++

int _tmain(int argc, _TCHAR* argv[]) { 

    system("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin"); 
    system("cd C:/thisfolder/"); 

    std::cin.get(); 
    return 0; 

} 

kiedy uruchomić program w Visual Studio to daje mi się czarny ekran i nie mogę zobaczyć prowadzony polecenia. Potrzebuję go, żeby sprawdzić, czy zadziałało, czy nie. Dzięki!

+0

Prawdopodobnie problem z przekierowaniem wyjścia. Funkcja 'system()' używa interpretera poleceń do uruchomienia łańcucha argumentów funkcji 'system()', więc może być tak, że interpreter poleceń nie dziedziczy twojego standardu, więc dane wyjściowe z polecenia nie trafiają do konsoli okno. Inną rzeczą może być to, że polecenia, których używasz, nie generują żadnych wyników. wypróbuj inne polecenie, takie jak polecenie 'echo', więc wykonaj coś w stylu' system ("echo to jest wyjście") '. –

+2

Nie jestem pewien, czy 'set'-ing (lub' cd') z jednym wywołaniem 'system' wpłynie na następne wywołanie' systemu' (w POSIX i Linux, jestem pewien, że to nie działa. znasz system Windows). –

+1

Czy rozważyłeś użycie jakiegoś interfejsu API systemu operacyjnego (np. [_chdir] (https://msdn.microsoft.com/en-us/library/bf7fwze1.aspx) ...) zamiast wywoływać 'system'? Lub użyj jakiegoś frameworku takiego jak [POCO] (http://pocoproject.org/), [Qt] (http://qt-project.org/), lub może Boost. –

Odpowiedz

7

Użyj popen zamiast system. Zobacz przykład tutaj https://msdn.microsoft.com/en-us/library/96ayss4b.aspx

char psBuffer[128]; 
FILE *pPipe; 

if((pPipe = _popen("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin", "rt")) == NULL) 
    exit(1); 

następnie

while(fgets(psBuffer, 128, pPipe)) { 
    printf(psBuffer); 
} 

if (feof(pPipe)) 
    printf("\nProcess returned %d\n", _pclose(pPipe)); 
1

Dane wyjściowe połączenia system powinny być wyświetlane na standardowe wyjście.

Nie wydaje mi się, aby te polecenia miały generalnie dane wyjściowe do wyświetlenia, jeśli się powiodą. Spróbuj dodać dir lub pwd after, aby wyświetlić katalog, w którym się znajdujesz.

Jeśli chcesz uzyskać dane wyjściowe z poleceń do programu do przetworzenia, to jest inny problem. Będziesz musiał użyć specyficznego dla OS API, lub przekierować wyjście do pliku, który możesz przeczytać.

+0

Mam na odwrót "system", ponieważ [wywołanie systemowe] (https://en.wikipedia.org/wiki/System_call) jest czymś bardzo różnym od funkcji biblioteki "system" –

0

spróbuj dodać pause jak poniżej czekać po każdym poleceniu. W przypadku awarii zostanie wyświetlony komunikat o błędzie. Po pomyślnym zakończeniu wyświetli się rzeczywiste wyjście z polecenia, , jeśli będzie to jakiekolwiek.

system("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin & pause"); 
system("cd C:/thisfolder/ & pause"); 

Zauważ, że każdy wywołanie system wykorzystuje cmd.exe (jak cmd /c [command]) wykonywanie poleceń i zmienne env jak PATH w jednym poleceniu nie wpłynie kolejny.

cmd.exe /c set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin 
cmd.exe /c cd C:/thisfolder/