Windows Bat 파일에서 다른 프로그램 실행을하고 자식 프로세스를 생성하지 않습니다.

StackOverflow https://stackoverflow.com/questions/1536205

문제

나는 무언가를 할 수있는 소통 후 후크가있는 Subversion Server가 있습니다.

곧 체크인이 끝나고 싶습니다. 후크 스크립트를 기다리지 마십시오. 그러나 디자인에 의해, 커미션 후 후크 스크립트는 모두까지 실행됩니다. 어린이 프로세스 종료.

다른 _prog 시작 ...

후크 배트 파일에서는 아무 소용이 없습니다.

따라서 Child Process를 생성하지 않거나 아동 프로세스가 부모와 분리되지 않는 Windows Bat 파일에서 다른 프로그램을 실행하는 방법을 알고 싶습니다.

도움이 되었습니까?

해결책 2

내 질문을 해결하고 다음 C 코드를 컴파일하고 Exe 출력을 runjob.exe로 명명 한 다음 후크 배트 파일에서 "runjob onerdo ever_prog"를 사용하는 방법을 찾았습니다. 이제 괜찮습니다.

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

다른 팁

동기. 두 번째 메모장은 첫 번째를 닫을 때까지 시작되지 않습니다.

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.robvandanderwoude.com/ntstart.php

편집하다: 다음 주석은 원래 포스터 인 @zhongshu에 의해 다른 곳에서 이루어졌습니다. 여기에만 복사하고 있습니다.

SVN 이후 CMD /C는 작동하지 않습니다. SVN 포스트 커밋 후크가 후크 및 Hook Exit에서 생성 된 하위 프로세스를 기다리기 때문에 작동하지 않습니다. SVN의 디자인입니다. 해결책을 찾았습니다. 참조하십시오. http://svn.haxx.se/users/archive-2008-11/0301.shtml

그가 자신이 말하는 것을 알고 있다고 가정하면, 나는 틀렸다.

당신이 할 수있는 것은 배치 스크립트 또는 오랫동안 실행되는 기타 실행 파일을 실행하는 예정된 작업을 만드는 것입니다. 과거에 한 번 실행되도록 설정하고 더 이상 실행이 예정되지 않은 경우 작업을 삭제하도록 설정하지 마십시오. 그런 다음 Subversion Hook 스크립트에서 다음 줄을 넣습니다.

schtasks /run /tn NameOfYourTaskHere

예정된 작업을 실행하여 메모장 ++를 실행하여 테스트를 확인했으며 메모장 ++ 실행 파일이 CMD.exe 창이 아닌 SVCHOST.EXE의 자식으로 표시되었습니다. schtasks 명령.

사용:

start cmd /c "your command"

건배.

노력하다 cmd /c "your command"

Windows Task Scheduler 명령 줄 인터페이스 "Schtasks /Run"을 사용하여 "Other_Prog"를 실행하는 작업을 시작할 수 있습니까? 당신은 미리 작업을 만들어야합니다. 예전에는 "AT"명령 스케줄러에 대한 동적 항목을 생성하는 Windows (NT) 리소스 키트가있는 "곧"프로그램이 있었는데 몇 분 안에 작업을 미리 설정할 필요가없는 작업을 실행할 필요가 없었습니다. 약간의 검색으로 여전히 찾을 수 있습니다.

jscript 부품이 실행되는 하이브리드 배치/JScript 파일 (즉, 임베디드 JScript를 실행할 수있는 배치 파일)을 만들 수 있습니다. 또 다른 _prog 분리 모드에서 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));`
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top