Próbowałem użyć CreateProcess, aby uruchomić proste polecenie, takie jak hg > test.txt
. Próbowałem uruchomić ciąg jako całość (w przeciwieństwie do rozdzielenia go na nazwę aplikacji i jej parametry). Dlaczego CreateProcess(0, "notepad.exe test.txt", ...)
dziala, ale CreateProcess(0, "hg > test.txt", ...)
nie?Jak przekierować dane wyjściowe do pliku za pomocą CreateProcess?
Odpowiedz
Nie można użyć stdout przekierowanie w wierszu polecenia przekazywane do CreateProcess
. Aby przekierować standardowe wyjście, musisz określić uchwyt pliku dla wyjścia w strukturze STARTUPINFO
.
Jesteś również dokonywania inny, bardziej subtelny, błąd. Drugi parametr, lpCommandLine
, musi wskazywać na pamięć zapisu, ponieważ CreateProcess
nadpisuje bufor. Jeśli używasz wersji ANSI tej funkcji, uciekniesz, ale nie dla wersji Unicode.
Wersja Unicode tej funkcji, CreateProcessW, mogą modyfikować zawartość tego łańcucha. Dlatego ten parametr nie może być wskaźnikiem dla pamięci tylko do odczytu (takiej jak const zmienna lub ciąg literowy). Jeśli ten parametr jest stałym ciągiem, funkcja może spowodować naruszenie zasad dostępu.
Dla ciekawskich, dlaczego trzeba przejść w buforze do zapisu: [Dlaczego funkcja 'CreateProcess' zmodyfikować swój wiersz polecenia wejściowe?] (Http://blogs.msdn.com/b/oldnewthing/archive/2009/06 /01/9673254.aspx) –
Niekoniecznie popełnia błąd, nie czyniąc drugiego punktu parametru zapisywalną pamięcią.Możliwe, że nie kompiluje się ze zdefiniowanym 'UNICODE', w którym to przypadku' CreateProcess' to 'CreateProcessA', który nie ma tego wymagania. –
@FrerichRaabe To szczegół implementacji bieżących wersji systemu Windows. Jeśli spojrzysz na dokumentację MSDN, zobaczysz, że typ drugiego parametru to 'LPTSTR'. W każdym razie, właśnie w punkcie drugim podałem tę kwestię. –
CreateProcess() uruchamia procesy, nie jest to program itnerpreter wiersza poleceń. Nie wie, co ">" oznacza i nie będzie przekierowywać za Ciebie. Musisz otworzyć plik test.txt siebie i przekazać do niego uchwyt do CreateProccess wewnątrz struktury STARTUPINFO: CreateProcess STARTUPINFO
Microsoft ma przykład jak przekierować standardowe wyjście: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx.
Tak, tego rodzaju prace, ale pamiętaj, że w tym przykładzie występuje błąd, który uniemożliwia wyjście 'ReadFromPipe'. Przed wywołaniem tej funkcji należy wywołać: 'CloseHandle (g_hChildStd_OUT_Wr);'. Prawdopodobnie będziesz także chciał poczekać na zakończenie procesu potomnego, zanim zamkniesz uchwyt, aby przetworzyć coś takiego: 'WaitForSingleObject (piProcInfo.hProcess, INFINITE);'. – Nux
Poniższy kod tworzy proces konsoli mniej z stdout i stderr przekierowany do określonego pliku.
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE h = CreateFile(_T("out.log"),
FILE_APPEND_DATA,
FILE_SHARE_WRITE | FILE_SHARE_READ,
&sa,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL ret = FALSE;
DWORD flags = CREATE_NO_WINDOW;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = NULL;
si.hStdError = h;
si.hStdOutput = h;
TCHAR cmd[]= TEXT("Test.exe 30");
ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if (ret)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
return -1;
}
Opis obok kodu byłby przydatny. Przynajmniej komentarze –
Możliwe CloseHandle() pliku po spłodzonym procesie potomnym jest pominięte. – SerG
Czy hStdInput nie powinien być INVALID_HANDLE_VALUE zamiast NULL? –
należy uruchomić proces cmd.exe z parametrami "/ c command line". Spowoduje to przekierowanie danych wyjściowych do pliku lub zorganizowanie potoku przez CreateProcess.
- 1. Jak przekierować dane wyjściowe procesora do łańcucha?
- 2. Wyślij dane wyjściowe do pliku
- 3. Jak przekierować dane wyjściowe aplikacji w tle do/dev/null
- 4. Jak przekierować dane wyjściowe z debugera Visual Studio?
- 5. STORE dane wyjściowe do jednego pliku CSV?
- 6. Dane wyjściowe XMLWriter do pliku XML
- 7. Jak przekierować Boost.Log do pliku
- 8. Jak dostosować dane wyjściowe niestandardowego typu za pomocą printf?
- 9. Python, jak wysłać dane wyjściowe do pliku i terminala
- 10. Jak potokować dane wyjściowe polecenia do pliku na Linuksie
- 11. Jak przekierować wyjściowe procesy potomne na stderr?
- 12. Jak eksportować dane do pliku Excela za pomocą PHPExcel
- 13. Jak przekazać dane wyjściowe AWK do zmiennej?
- 14. Jak przekierować stronę za pomocą JavaScript?
- 15. Jak przekierować rozszerzenie html za pomocą htaccess?
- 16. Dane pliku tekstowego analizujące wiersze i dane wyjściowe jako kolumny
- 17. zwraca dane wyjściowe słownika do porządku alfabetycznego
- 18. Jak przekierować moje dane wyjściowe dziennika z logcat na kartę SD na urządzeniu z Androidem?
- 19. Jak uzyskać dane wyjściowe odrodzonego procesu child_process w pliku Node.JS?
- 20. Windows Batch Script: Przekieruj WSZYSTKIE dane wyjściowe do pliku
- 21. IPython: szybko zrzuć dane wyjściowe komórki do pliku
- 22. Przekieruj dane wyjściowe polecenia "puts" do pliku dziennika
- 23. Dołącz dane wyjściowe apsrtable (lub stargazer) do pliku Rmd
- 24. błąd CreateProcess = 206 Nazwa pliku lub rozszerzenie jest za długie
- 25. Zapisuj dane posta do pliku za pomocą PHP
- 26. Wyłącz wyjściowe dane wyjściowe logcat w Androidzie
- 27. Jak przekierować wyjście konsoli do pliku tekstowego
- 28. Jak przekierować wyjście kompilatora gcc do pliku?
- 29. Jak uzyskać dane wyjściowe asemblera z pliku C w VS2005
- 30. Chef - Jak uzyskać dane wyjściowe polecenia do Ruby zmiennej
'CreateProcess' nie wie o przekierowaniach. Dlaczego nie używasz 'system (3)'? Niech zgadnę: możesz zrobić to lepiej niż system (3). – cnicutar
@cnicutar Zawsze zastanawiałem się, co oznaczała notacja "funkcja (liczba)". Co oznacza "system (3)"? –
@Seth Carnegie Sekcja podręcznika. 'system man 3'. – cnicutar