我有一个后置提交钩子颠覆服务器做一些事情。
我希望尽快完成检查,而不是等待钩子脚本。 但是通过devise,Subversion post-commit钩子脚本将运行,直到所有的子进程退出,所以使用类似下面的东西:
开始another_prog …
在hook bat文件中没有用处。
所以我想知道如何在Windows bat文件中运行另外一个不创buildsubprocess的程序,或者让subprocess与父进程分离。
同步。 第二个记事本将不会启动,直到你关闭第一个。
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,原来的海报。 我只是在这里复制它:
启动cmd / c不起作用,因为SVN提交后挂钩将等待钩子和由钩子出口创建的子进程。 这是SVN的设计。 我找到了一个解决方案,请参考: http : //svn.haxx.se/users/archive-2008-11/0301.shtml
假设他知道他在说什么,我错了,…不配。
我找到了一个解决我的问题的方法,编译下面的c代码,并将exe输出命名为runjob.exe,然后在hook 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; }
你可以做的是创建一个计划任务,执行批处理脚本或其他长期运行的可执行文件。 将其设置为过去运行一次,并且不要在没有更多运行计划时将其设置为删除任务。 然后在你的Subversion钩子脚本中,把下面一行放在:
schtasks /run /tn NameOfYourTaskHere
我通过测试确认了我的计划任务运行Notepad ++,记事本++可执行文件显示为svchost.exe的子项,而不是执行schtasks
命令的cmd.exe窗口。
使用:
start cmd /c "your command"
干杯。
你可以使用Windows任务调度程序命令行界面“schtasks / run”来启动运行“another_prog”的作业吗? 你必须提前创造工作。 Windows(NT)资源工具包还曾经是一个“SOON”程序,它将为“AT”命令调度程序创建动态条目,以在几分钟内运行作业,而不需要提前设置作业,它仍然可以找到一点搜索。
尝试cmd /c "your command"
您可以创建一个混合批处理/ JScript文件(即一个能够运行嵌入式JScript的批处理文件),其中JScript部分将以shell.Run(prog,0,false)的分离模式运行another_prog :
@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));`