2009-10-08 4 views
14

Ich habe Subversion-Server mit einem Post-Commit-Hook, etwas zu tun.Ausführen eines anderen Programms in Windows Bat-Datei und nicht untergeordneten Prozess erstellen

Ich möchte das Checkin Finish bald, nicht warten das Hook-Skript. Aber durch Design, die Subversion post-commit Hook-Skript ausgeführt wird, bis alle Kind Prozess-Exit, so somthing mit wie: keine Verwendung hat

Start another_prog ...

in den Haken bat-Datei.

Also ich möchte wissen, wie man ein anderes Programm in Windows-Bat-Datei, die nicht untergeordneten Prozess erstellen oder lassen Sie den Kindprozess von der übergeordneten trennen.

+0

Können Sie klären, welches Problem du lösen willst? Ist es wirklich so, dass der Subversion-Post-Commit-Hook darauf wartet, dass alle Prozesse beendet werden? Warum funktioniert 'cmd/c startWebLogic.cmd' nicht? – Cheeso

+4

Start cmd/c funktioniert nicht, da der SVN-Post-Commit-Hook auf den Hook und den ** child ** -Prozess wartet, der vom Hook-Exit erstellt wurde. Es ist das Design von SVN. Ich habe eine Lösung gefunden, siehe: http://svn.haxx.se/users/archive-2008-11/0301.shtml – zhongshu

Antwort

12

Ich habe eine Methode gefunden, um meine Frage zu lösen, kompilieren Sie den folgenden c-Code und benannte die exe-Ausgabe als runjob.exe, und dann in der hook bat-Datei, verwenden Sie "runjob another_prog", jetzt ist es in Ordnung.

#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; 
} 
+0

Millionen Dank für die richtige Lösung! Es ist immer noch ein bisschen unangenehm, ein eigenes Programm zu erstellen, um ein anderes Programm auszuführen. Allerdings 100-mal besser als geplante Aufgaben und so weiter. Thx thx thx – Honzajscz

+3

Hier ist ein Link zu einer kompilierten ausführbaren Datei des Quellcodes: https://mega.nz/#!u8tD0YAY!OuULXWhzG4VThwLAbkjpRdTfg6XLgxFmmpNP2hnzb1w –

+1

Wie wäre es damit, einige Vorkehrungen zu treffen, um Kommandozeilenargumente zu "another_prog" zu liefern? Andernfalls müsste ich ein weiteres Stapelscript einbinden, um die exe mit den Argumenten aufzurufen – evandrix

0

Ausprobieren cmd /c "your command"

+1

Nein, cmd/c hat keine Verwendung, svn wird warten, bis der "Ihr Befehl" zu beenden. – zhongshu

1

Könnten Sie verwenden die Windows-Taskplaner Befehlszeilenschnittstelle „schtasks/run“ einen Job zu starten, der die „another_prog“ läuft? Sie müssten den Job im Voraus erstellen. Es gab auch ein "SOON" -Programm mit dem Windows (NT) Resource Kit, das dynamische Einträge für den "AT" -Befehlsplaner erstellen würde, um einen Job in wenigen Minuten auszuführen, ohne dass vorher ein Job eingerichtet werden musste. es kann immer noch mit ein wenig Suche gefunden werden.

3

Verwendung:

start cmd /c "your command" 

Beifall.

+0

In vielen Fällen sollten Sie das "cmd/c" weglassen können (siehe Antwort von Corey Trager) – jdigital

+0

Dies funktioniert nicht für SVN Post-Commit Hook unter Windows. Es wird immer noch auf den Abschluss des Child-Prozesses warten. Siehe [Corey Tragers Antwort] (http://stackoverflow.com/questions/1536205/running-another-program-in-windows-bat-file-and-not-create-child-process/1569941#1569941) – truemedia

16

Synchron. Der zweite Notizblock wird erst gestartet, wenn Sie den ersten Notizblock geschlossen haben.

Asynchron: Der zweite Editor wird gestartet, auch wenn Sie den ersten nicht geschlossen haben.

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

Mehr Informationen zu den Startbefehl:
http://www.robvanderwoude.com/ntstart.php

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

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

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

5

Sie können einen geplanten Task erstellen, der das Batch-Skript oder eine andere ausführbare Datei ausführt, die für eine lange Zeit ausgeführt wird. Legen Sie fest, dass das Programm einmal ausgeführt werden soll, und legen Sie nicht fest, dass es den Task löschen soll, wenn keine weiteren Runs geplant sind. Dann in Ihrer Subversion Hook-Skript, legten Sie die folgende Zeile in:

schtasks /run /tn NameOfYourTaskHere 

ich mit einem Test bestätigt durch mein geplante Task läuft Notepad mit ++ und das Notepad ++ ausführbaren auftauchen als Kind von svchost.exe, nicht die cmd.exe Fenster, dass ich den Befehl schtasks von ausgeführt habe.

+0

Dies funktioniert wirklich gut für den SVN Post Commit auf Windows. Wir haben ein Powershell-Skript verwendet, das bei jedem Commit für svn eine merkbare Verzögerung verursachte. Mit der geplanten Aufgabe wird das Commit sofort beendet und die Aufgabe wird im Hintergrund ausgeführt. 'schtasks/run/tn NameOfTask' ist hier die beste Lösung. – truemedia

0

Sie eine/JScript-Datei Hybrid Batch erstellen kann (dh eine Batch-Datei eingebetteten JScript ausgeführt werden), wo der Teil JScript wird another_prog in freistehenden Modus mit shell.Run(prog, 0, false) laufen:

@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));` 
Verwandte Themen