Запуск другой программы в файле Windows bat и не создание дочернего процесса

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

Вопрос

У меня есть сервер subversion с хуком после фиксации, чтобы что-то сделать.

Я хочу, чтобы проверка завершилась как можно скорее, а не ждала запуска скрипта.Но по замыслу, сценарий перехвата Subversion после фиксации будет выполняться до тех пор, пока все ребенок завершите процесс, поэтому используйте что-то вроде:

запустите another_prog...

в hook bat файл бесполезен.

Итак, я хочу знать, как запустить другую программу в файле Windows bat, которая не создает дочерний процесс или позволяет дочернему процессу отделиться от родительского.

Это было полезно?

Решение 2

Я нашел способ решить свой вопрос, скомпилировал следующий код C и назвал вывод exe как runjob.exe, а затем в bat-файле перехватчика использовал «runjob Another_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

Дополнительная информация о команде start:
http://www.robvanderwoude.com/ntstart.php

Редактировать:Следующий комментарий был сделан в другом месте @zhongshu, оригинальным постером.Я всего лишь копирую это здесь:

запуск cmd /c не работает, потому что SVN перехват после фиксации будет ожидать завершения перехвата и дочернего процесса, созданного с помощью перехвата.Это дизайн SVN.Я нашел решение, пожалуйста, обратитесь: http://svn.haxx.se/users/archive-2008-11/0301.shtml

Предполагая, что он знает, о чем говорит, я ошибаюсь и ... не заслуживаю этого.

Что вы можете сделать, так это создать запланированную задачу, которая выполняет пакетный сценарий или другой исполняемый файл, который выполняется в течение длительного времени.Установите его для запуска один раз в прошлом и не настраивайте его на удаление задачи, когда больше не запланировано выполнение.Затем в скрипте ловушки Subversion вставьте следующую строку:

schtasks /run /tn NameOfYourTaskHere

Я подтвердил это с помощью теста, запустив мою запланированную задачу Notepad++, и исполняемый файл Notepad++ появился как дочерний элемент svchost.exe, а не окна cmd.exe, в котором я выполнил schtasks команда от.

Использовать:

start cmd /c "your command"

Ваше здоровье.

Пытаться cmd /c "your command"

Не могли бы вы использовать интерфейс командной строки планировщика задач Windows «schtasks /run», чтобы запустить задание, запускающее «another_prog»?Вам придется создать задание заранее.Раньше также существовала программа «СКОРО» с Windows (NT) Resource Kit, которая создавала динамические записи для планировщика команд «AT» для запуска задания за несколько минут, что не требовало предварительной настройки задания. его все еще можно найти, немного поискав.

Вы можете создать гибридный пакетный файл/файл JScript (т. е.пакетный файл, способный запускать встроенный JScript), в котором будет выполняться часть JScript другая_прог в автономном режиме с Shell.Run(прог, 0, ложь):

@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