¿Cómo redirijo la salida a un archivo con CreateProcess?


Intenté usar CreateProcess para ejecutar un comando simple como hg > test.txt. Intenté ejecutar la cadena como un todo (en lugar de separarla en un nombre de aplicación y sus parámetros). ¿Por qué CreateProcess(0, "notepad.exe test.txt", ...) funciona pero CreateProcess(0, "hg > test.txt", ...) no funciona?

Author: Rob Kennedy, 2011-08-11

5 answers

No puede usar la redirección stdout en la línea de comandos pasada a CreateProcess. Para redirigir la salida estándar debe especificar un controlador de archivo para la salida en el STARTUPINFO estructura.

También estás cometiendo otro error, más sutil. El segundo parámetro, lpCommandLine debe apuntar a la memoria grabable porque CreateProcess sobrescribe el búfer. Si está utilizando la versión ANSI de la función, entonces se saldrá con la suya, pero no para la versión Unicode.

El La versión Unicode de esta función, CreateProcessW , puede modificar el contenido de esta cadena. Por lo tanto, este parámetro no puede ser un puntero a la memoria de solo lectura (como una variable const o una cadena literal). Si este parámetro es una cadena constante, la función puede causar una violación de acceso.

 21
Author: David Heffernan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-10 21:45:59

El siguiente código crea un proceso sin consola con stdout y stderr redirigidos al archivo especificado.

#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;
}
 20
Author: Lukas Koblovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 11:42:55

CreateProcess() lanza procesos, no es un itnerpreter de línea de comandos. No sabe qué es " > " y no hará la redirección de transmisión por usted. Es necesario abrir el archivo de prueba.txt a ti mismo y pasar el handle a CreateProcess dentro de la estructura STARTUPINFO: CreateProcess STARTUPINFO

 7
Author: MK.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-10 21:46:30

Microsoft tiene un ejemplo de cómo redirigir la salida estándar: http://msdn.microsoft.com/en-us/library/ms682499 (VS.85).aspx .

 7
Author: Tamas Demjen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-10 23:34:25

Debe ejecutar process cmd.exe con parámetros "/ c command line". Esto redirigirá la salida a un archivo o para organizar una canalización a través de CreateProcess.

 -1
Author: Boris Yaroslav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-21 11:04:24