Подтвердить что ты не робот

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

У меня есть сервер subversion с крюком post-commit, чтобы что-то сделать.

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

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

в файле bat bat нет необходимости.

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

4b9b3361

Ответ 1

Я нашел метод для решения моего вопроса, скомпилировал следующий c-код и назвал вывод exe как runjob.exe, а затем в файле bat 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 environment block 
        NULL, // Use parent 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; 
} 

Ответ 2

Синхронный. Второй блокнот не запускается, пока вы не закроете первый.

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

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

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

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

Ответ 3

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

schtasks /run /tn NameOfYourTaskHere

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

Ответ 4

Использование:

start cmd /c "your command"

Приветствия.

Ответ 5

Попробуйте cmd /c "your command"

Ответ 6

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

Ответ 7

Вы можете создать гибридный пакетный /JScript файл (то есть пакетный файл, способный запускать встроенный JScript), где часть JScript будет запускать another_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));`