Запуск другой программы в Windows bat файле и не создание дочернего процесса
У меня есть сервер subversion с крюком post-commit, чтобы что-то сделать.
Я хочу, чтобы проверка завершилась в ближайшее время, а не ждать крюка script.
Но по дизайну крюк post-commit Subversion script будет работать до тех пор, пока не завершится процесс дочерний, поэтому используйте somthing like:
запустите another_prog...
в файле bat bat нет необходимости.
Итак, я хочу знать, как запускать другую программу в файле bat для Windows, которая не создает дочерний процесс, или позволяет дочернему процессу отсоединяться от родителя.
Ответы
Ответ 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));`