Frage

Ich habe Subversion-Server mit einem post-commit Haken, etwas zu tun.

Ich mag die checkin Finish bald, nicht den Hook-Skript warten. Aber durch Design, die Subversion post-commit Hook-Skript ausgeführt werden soll, bis alle Kind Prozess-Exit, so mit ungefähr wie:

starten another_prog ...

in der Haken bat-Datei hat keine Verwendung.

Also ich möchte wissen, wie ein anderes Programm in Windows bat-Datei auszuführen, die nicht untergeordneten Prozess erstellen oder das Kind Prozess lösen sich von der Mutter lassen.

War es hilfreich?

Lösung 2

fand ich eine Methode, meine Frage zu lösen, kompiliert den folgenden C-Code und die exe Ausgabe als runjob.exe genannt, und dann in der Haken bittet-Datei, verwenden Sie „runjob another_prog“, jetzt ist es ok.

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 
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; 
} 

Andere Tipps

Synchron. Der zweite Notizblock wird nicht starten, bis Sie die erste schließen.

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

Asynchronous. Der zweite Notizblock wird gestartet, auch wenn Sie nicht das erste geschlossen

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

Weitere Informationen über den Startbefehl:
http://www.robvanderwoude.com/ntstart.php

Bearbeiten : Der folgende Kommentar wurde an anderer Stelle von @zhongshu, das ursprüngliche Plakat gemacht. Ich bin Kopieren es nur hier:

  

starten cmd / c funktioniert nicht, weil SVN   post-commit Haken für die warten   Haken und das Kind Prozess erstellt von   der Haken Ausgang. Es ist das Design von SVN.   Ich habe eine Lösung gefunden, lesen Sie bitte:    http://svn.haxx.se/users/archive-2008-11 /0301.shtml

Unter der Annahme, dass er weiß, was er spricht, ich bin falsch und ... unwürdig.

Was Sie tun können, ist eine geplante Task erstellen, der die Batch-Skript oder andere ausführbare Datei, die Läufe für eine lange Zeit ausgeführt wird. Stellen Sie es einmal, in der Vergangenheit laufen und nicht setzen es um die Aufgabe zu löschen, wenn keine weiteren Läufe geplant sind. Dann in Ihrem Subversion Hook-Skript, legen Sie die folgende Zeile in:

schtasks /run /tn NameOfYourTaskHere

ich mit einem Test bestätigt durch mein geplantes Task läuft Notepad mit ++ und das Notepad ++ ausführbare Datei als Kind von svchost.exe auftauchte, nicht die cmd.exe-Fenster, dass ich ausgeführt, um den schtasks Befehl aus.

Verwendung:

start cmd /c "your command"

Prost.

Versuchen cmd /c "your command"

Könnten verwenden Sie die Windows-Taskplaner Befehlszeilenschnittstelle „schtasks / run“ einen Job zu starten, der die „another_prog“ läuft? Sie müßten die Arbeit vor der Zeit zu schaffen. Es gibt auch ein „bald“ Programm mit dem Windows (NT) Resource Kit verwendet werden, die dynamische Einträge für den „AT“ Befehlsscheduler schaffen würde, einen Job in ein paar Minuten laufen zu lassen, die nicht einen Job vor der Zeit erfordern die Einrichtung würde, es kann immer noch mit einer wenig Suche gefunden werden.

Sie können ein Hybrid-batch / JScript-Datei erstellen (dh eine Batch-Datei Lage laufen eingebettet JScript), wo das Teil JScript läuft another_prog in freistehendem Modus mit 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));`
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top