Ejecuta otro progtwig en el archivo bat de Windows y no crea el proceso secundario

Tengo un servidor de subversión con un gancho post-commit para hacer algo.

Quiero que el checkin termine pronto, no espere el script del gancho. Pero, por diseño, el script de subversión post-commit hook se ejecutará hasta que todos los procesos secundarios salgan, por lo que se puede usar algo como:

iniciar another_prog …

en el archivo hook bat no tiene uso.

Así que quiero saber cómo ejecutar otro progtwig en el archivo bat de Windows que no crea un proceso hijo o deja que el proceso hijo se separe del padre.

Sincrónico. El segundo bloc de notas no se abrirá hasta que cierre el primero.

 notepad.exe c:\temp\a.txt notepad.exe c:\temp\b.txt 

Asincrónico: el segundo bloc de notas se lanzará incluso si no ha cerrado el primero.

 start notepad.exe c:\temp\a.txt start notepad.exe c:\temp\b.txt 

Más información sobre el comando de inicio:
http://www.robvanderwoude.com/ntstart.php

EDITAR : El siguiente comentario fue hecho en otro lugar por @zhongshu, el póster original. Solo estoy copiando aquí:

start cmd / c no funciona porque SVN post-commit hook esperará por el hook y el proceso secundario creado por la salida hook. Es el diseño de SVN. Encontré una solución, consulte: http://svn.haxx.se/users/archive-2008-11/0301.shtml

Suponiendo que él sepa de lo que está hablando, me equivoco y … no lo merezco.

Encontré un método para resolver mi pregunta, compilé el siguiente código c y llamé a la salida exe como runjob.exe, y luego en el archivo hook bat, uso “runjob another_prog”, ahora está bien.

 #include  #include  #include  int _tmain() { char * pCmd = ::GetCommandLine(); // skip the executable if (*pCmd++ == L'"') { while (*pCmd++ != L'"'); } else { while (*pCmd != NULL && *pCmd != L' ') ++pCmd; } while (*pCmd == L' ') pCmd++; STARTUPINFO si; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); PROCESS_INFORMATION pi; ZeroMemory( &pi, sizeof(pi) ); // Start the child process. BOOL result = CreateProcess ( NULL, // No module name (use command line) pCmd, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set bInheritHandles to FALSE DETACHED_PROCESS, // Detach process NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi // Pointer to PROCESS_INFORMATION structure (returned) ); if (result) return 0; char msg[2048]; FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT), msg, sizeof(msg), NULL ); fputs(msg, stderr); _flushall(); return -1; } 

Utilizar:

 start cmd /c "your command" 

Aclamaciones.

Lo que puede hacer es crear una tarea progtwigda que ejecute el script por lotes u otro ejecutable que se ejecute durante un tiempo prolongado. Configúrelo para que se ejecute una vez, en el pasado y no lo configure para eliminar la tarea cuando no se progtwign más ejecuciones. Luego, en su script de enlace de Subversion, ponga la siguiente línea en:

 schtasks /run /tn NameOfYourTaskHere 

Confirmé con una prueba al hacer que mi tarea progtwigda ejecutara Notepad ++ y el ejecutable Notepad ++ apareció como un elemento secundario de svchost.exe, no la ventana cmd.exe desde la que schtasks comando schtasks .

Pruebe cmd /c "your command"

¿Podría utilizar la interfaz de línea de comandos del planificador de tareas de Windows “schtasks / run” para iniciar un trabajo que ejecute el “otro_proceso”? Tendría que crear el trabajo antes de tiempo. También solía haber un progtwig “PRONTO” con el Kit de recursos de Windows (NT) que crearía entradas dinámicas para que el planificador de comandos “AT” ejecutara un trabajo en unos minutos que no requiriera configurar un trabajo antes de tiempo, todavía se puede encontrar con un poco de búsqueda.

Puede crear un archivo híbrido por lotes / JScript (es decir, un archivo por lotes capaz de ejecutar JScript incorporado) donde la parte JScript ejecutará another_prog en modo separado con shell.Run (prog, 0, false) :

 @if (@X)==(@Y) @end /* JScript comment rem put any batch code that runs before another_prog here @cscript //E:JScript //nologo "%~f0" "another_prog" 0 false rem put any batch code that runs after another_prog here exit /b %errorlevel% @if (@X)==(@Y) @end JScript comment */ var ARGS = WScript.Arguments; var shell = new ActiveXObject("WScript.Shell"); shell.Run(ARGS.Item(0),ARGS.Item(1),ARGS.Item(2));`