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

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

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

запустить другую_прогу...

в крючок bat файл не имеет смысла.

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


person zhongshu    schedule 08.10.2009    source источник
comment
Можете ли вы уточнить, какую проблему вы пытаетесь решить? Действительно ли хук post-commit subversion ожидает завершения всех процессов? почему start cmd /c startWebLogic.cmd не работает?   -  person Cheeso    schedule 12.10.2009
comment
start cmd /c не работает, потому что хук после фиксации SVN будет ждать хук и дочерний процесс, созданный выходом хука. Это дизайн SVN. Я нашел решение. См.: svn.haxx.se/users /archive-2008-11/0301.shtml   -  person zhongshu    schedule 12.10.2009


Ответы (7)


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

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 будет ждать хук и дочерний процесс, созданный выходом хука. Это дизайн SVN. Я нашел решение. См.: http://svn.haxx.se/users/archive-2008-11/0301.shtml

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

person Corey Trager    schedule 15.10.2009

Я нашел способ решить свой вопрос, скомпилировать следующий код 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; 
} 
person zhongshu    schedule 17.10.2009
comment
Миллион благодарностей за правильное решение! Все еще немного неудобно создавать свою собственную программу для выполнения какой-то другой программы. Однако в 100 раз лучше, чем использовать запланированные задачи и так далее. спасибо спасибо спасибо - person Honzajscz; 03.06.2011
comment
Вот ссылка на скомпилированный исполняемый файл исходного кода: mega.nz/#!u8tD0YAY!OuULXWhzG4VThwLAbkjpRdTfg6XL6XL а> - person Håkon Egset Harnes; 22.06.2015
comment
как насчет того, чтобы предоставить аргументы командной строки для another_prog? в противном случае мне пришлось бы задействовать другой пакетный скрипт для вызова exe с аргументами - person evandrix; 05.05.2016

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

schtasks /run /tn NameOfYourTaskHere

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

person jasonh    schedule 15.10.2009
comment
Это очень хорошо работает для фиксации SVN Post в Windows. Мы использовали сценарий Powershell, который вызывал заметную задержку с любой фиксацией в svn. Теперь с запланированной задачей фиксация завершается немедленно, и задача выполняется в фоновом режиме. schtasks /run /tn NameOfTask - лучшее решение здесь. - person truemedia; 25.09.2015

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

start cmd /c "your command"

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

person OJ.    schedule 12.10.2009
comment
Во многих случаях вы должны иметь возможность опустить cmd /c (см. ответ Кори Трагера) - person jdigital; 15.10.2009
comment
Это не будет работать для хука после фиксации SVN в Windows. Он все равно будет ждать завершения дочернего процесса. См. ответ Кори Трагера - person truemedia; 25.09.2015

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

person lsiu    schedule 08.10.2009
comment
Нет, cmd /c бесполезен, svn будет ждать завершения вашей команды. - person zhongshu; 09.10.2009

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

person SqlACID    schedule 12.10.2009

Вы можете создать гибридный пакетный/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));`
person dlauzon    schedule 08.03.2017