在Windows bat文件中运行另一个程序,但不创建子进程
我有一个带有post-commit钩子的subversion服务器来做一些事情 我希望尽快完成签入,而不是等待钩子脚本。 但根据设计,Subversion提交后钩子脚本将一直运行到所有子进程退出为止,因此使用如下方式: 开始另一个程序 在hook中,bat文件没有任何用处在Windows bat文件中运行另一个程序,但不创建子进程,windows,batch-file,svn,svn-hooks,post-commit,Windows,Batch File,Svn,Svn Hooks,Post Commit,我有一个带有post-commit钩子的subversion服务器来做一些事情 我希望尽快完成签入,而不是等待钩子脚本。 但根据设计,Subversion提交后钩子脚本将一直运行到所有子进程退出为止,因此使用如下方式: 开始另一个程序 在hook中,bat文件没有任何用处 因此,我想知道如何在Windows bat文件中运行另一个程序,该程序不创建子进程,也不让子进程与父进程分离。请尝试cmd/c您的命令是否可以使用Windows任务计划程序命令行界面schtasks/run启动运行另一个程序的
因此,我想知道如何在Windows bat文件中运行另一个程序,该程序不创建子进程,也不让子进程与父进程分离。请尝试cmd/c您的命令是否可以使用Windows任务计划程序命令行界面schtasks/run启动运行另一个程序的作业?你必须提前创建工作。以前还有一个带有Windows NT资源工具包的SOON程序,它可以为AT命令计划程序创建动态条目,以便在几分钟内运行作业,而不需要提前设置作业,只需稍加搜索即可找到该作业。使用:
start cmd /c "your command"
干杯。。在关闭第一个记事本之前,第二个记事本不会启动
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
异步:即使尚未关闭第一个记事本,第二个记事本也将启动
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
有关start命令的详细信息:
编辑:以下评论由原海报@zhongshu在别处发表。我只是在这里复制:
start cmd/c不工作,因为SVN post-commit钩子将等待 钩子和由创建的子进程 吊钩出口。这是SVN的设计。 我已找到解决方案,请参考:
假设他知道他在说什么,我错了,而且……不值得。你能做的就是创建一个计划任务,执行批处理脚本或其他长时间运行的可执行文件。将其设置为在过去运行一次,不要将其设置为在不再计划运行时删除任务。然后在Subversion钩子脚本中,放入以下行:
schtasks /run /tn NameOfYourTaskHere
我通过测试确认了这一点,让我的计划任务运行Notepad++并且Notepad++可执行文件显示为svchost.exe的子文件,而不是执行schtasks命令的cmd.exe窗口。我找到了解决问题的方法,编译以下c代码并将exe输出命名为runjob.exe,然后在hook bat文件中,使用runjob另一个程序,现在就可以了
#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;
}
您可以创建一个混合批处理/JScript文件,即一个能够运行嵌入式JScript的批处理文件,其中JScript部件将在分离模式下运行另一个_prog,具有:
不,cmd/c没有用,svn将等待您的命令完成。您能否澄清您试图解决的问题?subversion提交后钩子是否真的会等待所有进程退出?为什么启动cmd/c startweblog.cmd不起作用?启动cmd/c不起作用,因为SVN post commit钩子将等待钩子和钩子出口创建的子进程。这是SVN的设计。我找到了一个解决方案,请参考:在许多情况下,您应该能够省略cmd/c see-answer by Corey tragert这将不适用于Windows上的SVN post-commit钩子。它仍将等待子进程完成。见百万感谢正确的解决方案!创建自己的程序来执行其他程序仍然有点不舒服。但是,比使用计划任务等要好100倍。Thx Thx Thx有一个指向源代码的已编译可执行文件的链接:做些准备,为另一个程序提供命令行参数,怎么样?否则,我将不得不包装另一个批处理脚本来调用带有argst的exe。这对于windows上的SVN Post commit非常有效。我们使用了一个Powershell脚本,该脚本在提交到svn时造成了明显的延迟。现在,对于计划任务,提交立即完成,任务在后台执行。schtasks/run/tn NameOfTask是这里最好的解决方案。