2009-10-08 4 views
14

게시물 커밋 후크가있는 Subversion 서버가 있습니다.Windows 박쥐 파일에서 다른 프로그램을 실행하고 하위 프로세스를 생성하지 않습니다.

나는 곧 체크인을 끝내고, 후크 스크립트를 기다리지 말라. 그러나 디자인에 의해, 서브 버전 이후의 커밋 같은 뭔가를해야만 사용하여, 모든 아이 프로세스 종료 될 때까지 실행됩니다 훅 스크립트를 : 후크 박쥐 파일에

아무 소용이 없습니다

시작 another_prog ....

그래서 자식 프로세스를 생성하지 않거나 부모 프로세스에서 자식 프로세스를 분리하도록 다른 프로그램을 Windows BAT 파일에서 실행하는 방법을 알고 싶습니다.

+0

당신에게 수 해결하려는 문제를 분명히하십시오. Subversion 커밋 후크가 모든 프로세스가 종료 될 때까지 기다리는 것이 사실입니까? 왜 'start cmd/c startWebLogic.cmd'가 작동하지 않습니까? – Cheeso

+4

시작 cmd/c는 SVN 포스트 커밋 훅이 훅을 기다릴 것이고 훅 출구가 생성 한 ** 자식 프로세스 ** 때문에 작동하지 않습니다. 그것은 SVN의 디자인입니다. 나는 해결책을 찾았습니다. http://svn.haxx.se/users/archive-2008-11/0301.shtml – zhongshu

답변

12

내 질문을 해결하고 다음 C 코드를 컴파일하고 exe 출력을 runjob.exe로 명명 한 다음 hook bat 파일에서 runjob another_prog를 사용하는 방법을 찾았습니다. 이제는 ok입니다.

당신은 하이브리드 배치/JScript의 파일을 만들 수 있습니다
#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

수백만 명의 올바른 솔루션에 감사드립니다! 다른 프로그램을 실행하기 위해 자신의 프로그램을 만드는 것은 여전히 ​​조금 불편합니다. 그러나 예약 된 작업을 사용하면 100 배나 좋습니다. Thx thx thx – Honzajscz

+3

다음은 소스 코드의 컴파일 된 실행 파일에 대한 링크입니다. https://mega.nz/#!u8tD0YAY!OUULXWhzG4VThwLAbkjpRdTfg6XLgxFmmpNP2hnzb1w –

+1

'another_prog'에 명령 줄 인수를 제공하는 몇 가지 조항을 만드는 방법은 무엇입니까? 그렇지 않으면, 나는 args와 exe를 호출 주위에 다른 배치 스크립트를 래핑을 포함해야 할거야. – evandrix

0

cmd /c "your command"

+1

아니요, cmd/c는 아무 쓸모가 없습니다. svn은 "명령 완료"를 기다립니다. – zhongshu

1

당신은 "another_prog"를 실행하는 작업을 시작하기 위해 Windows 작업 스케줄러 명령 줄 인터페이스 "합니다 schtasks/실행"을 사용할 수보십시오? 미리 작업을 만들어야합니다. 이전에 작업을 설정하지 않아도되는 "AT"명령 스케줄러에 대한 동적 항목을 몇 분 안에 생성하는 Windows (NT) Resource Kit를 가진 "SOON"프로그램도있었습니다. 그것은 약간의 수색으로 아직도 발견 될 수있다.

3

사용 :

start cmd /c "your command" 

건배.

+0

많은 경우에 "cmd/c"를 생략 할 수 있어야합니다 (Corey Trager의 답변 참조). – jdigital

+0

Windows의 SVN 사후 커밋 훅에서는 작동하지 않습니다. 자식 프로세스가 완료 될 때까지 기다립니다. [Corey Trager의 답변] (http://stackoverflow.com/questions/1536205/running-another-program-in-windows-bat-file-and-not-create-child-process/1569941#1569941) – truemedia

16

동기식. 두 번째 메모장은 첫 번째 메모장을 닫을 때까지 실행되지 않습니다.

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

비동기 : 두 번째 메모장은 첫 번째 메모장을 닫지 않은 경우에도 시작됩니다. 시작 명령에 대한

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

상세 정보 :
http://www.robvanderwoude.com/ntstart.php

편집 다음 코멘트는 @zhongshu, 원래 포스터에 의해 다른 곳에서 만들어졌다. 나는 단지 여기에 복사 해요 :

시작에 cmd/c를 SVN 때문에 후크가 후크와 후크 출구에 의해 생성 된 자식 프로세스를 대기 후 커밋 작동하지 않습니다. 그것은 SVN의 디자인입니다. 나는 해결책을 발견 , 참조하시기 바랍니다 : http://svn.haxx.se/users/archive-2008-11/0301.shtml

은 그가 무슨 말을 알고 있다고 가정하면, 나는 ...받을 가치가없는 틀렸다.

5

오랫동안 실행되는 배치 스크립트 나 실행 파일을 실행하는 예약 된 작업을 만들 수 있습니다. 과거에 한 번 실행되도록 설정하고 더 이상 실행 일정이 예약되지 않은 경우 작업을 삭제하도록 설정하지 마십시오. 내가 Svchost.exe에서의 아이가 아닌 cmd를로 나타났다 내 예약 된 작업 실행 메모장 ++ 및 메모장 ++ 실행 파일을 가짐으로써 테스트로 확인

schtasks /run /tn NameOfYourTaskHere 

: 그런 다음 서브 후크 스크립트에 다음 줄을 넣어.실행 한 exe 창에서 schtasks 명령.

+0

이것은 작동합니다. 창문에 SVN 게시 커밋 정말 잘. 우리는 PowerShell 스크립트를 사용하여 svn 커밋과 함께 눈에 띄는 지연이 발생했습니다. 이제 예약 된 작업으로 커밋이 즉시 완료되고 작업이 백그라운드에서 실행됩니다. 'schtasks/run/tn NameOfTask'가 가장 좋은 해결책입니다. – truemedia

0

(즉, 내장의 JScript를 실행 할 수있는 배치 파일)을 JScript의 부분은 shell.Run(prog, 0, false)로 분리 모드에서 another_prog를 실행합니다 :

@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));` 
관련 문제