Запуск другой программы в Windows bat-файле, а не создание дочернего процесса - PullRequest
16 голосов
/ 08 октября 2009

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

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

Запустить еще_программу ...

в файле ловушек не используется.

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

Ответы [ 7 ]

18 голосов
/ 15 октября 2009

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

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, оригинальный постер Я только копирую это здесь:

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

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

12 голосов
/ 17 октября 2009

Я нашел метод для решения моего вопроса, скомпилировал следующий код c и назвал вывод exe как runjob.exe, а затем в файле ловушек используйте «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; 
} 
6 голосов
/ 16 октября 2009

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

schtasks /run /tn NameOfYourTaskHere

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

4 голосов
/ 12 октября 2009

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

start cmd /c "your command"

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

1 голос
/ 12 октября 2009

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

1 голос
/ 08 октября 2009

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

0 голосов
/ 08 марта 2017

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

@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));`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...