当运行Mercurial命令时,Windows批处理文件会退出

5

为了在Windows XP上每天备份我的mercurial仓库,我使用了一个简单的批处理文件hg_backup.bat,它只是做了一些目录更改和mercurial调用,并在最后加上了pause命令,类似于这样:

@Z:
@cd \hg_backup\drawings
hg pull -v
@cd \hg_backup\src\scripts
hg pull -v
@cd \hg_backup\eagle4\lbr
hg pull -v
@pause

这在用TortoiseHg安装的Mercurial 1.7版本之前都很好用。但是,自从使用Mercurial 1.8版本后,它开始执行第一个Mercurial命令,然后突然退出,没有到达下一个命令甚至脚本结尾。命令窗口就消失了。

我以前用Git时也遇到了同样的问题,但没有进一步调查,因为我只在一个代码库中使用Git。我认为,hg命令行调用的某个返回代码导致脚本结束而不是执行其他命令,但我还无法验证这一点。

是否有人知道为什么会出现这种情况,甚至如何解决它?


启动命令终端并在其中运行批处理文件,您应该会收到一些错误消息。 - krtek
不,以这种方式执行时没有任何错误消息。 - LeSpocky
2个回答

8
如果你的hg文件是hg.bat或者hg.cmd,请使用call hg命令,看它是否能正常运行。 command.com shell会执行批处理文件并替换旧脚本(为了节省内存),因此需要使用call命令来启动批处理脚本,并在稍后继续执行。这种行为在Windows的cmd.exe中保持兼容性。

你说得对,实际上 hg calledhg.cmd,在批处理文件中每次调用 hg 前加上 call 就可以解决问题。谢谢! :-) - LeSpocky
我很好奇将.cmd文件作为安装工具的一部分公开的决定背后是什么,因为在旧版本中并没有这样做,升级后由于此举我的整个构建服务器都崩溃了。 - Lasse V. Karlsen
@Lasse:在某些情况下,为了避免将真实目录放入%PATH%(因为它也会影响DLL搜索,而许多跨平台软件使用大量库;例如GTK+使用的程序),在其他情况下,为了准备运行时环境;可能是尝试自动找到正确的python.exe的一种方式? - user1686

0

我遇到了完全相同的问题,但是@grawity提供的解决方案对我没有用(而且我不知道为什么)。

在我的情况下,解决方案是将call替换为cmd /C,像这样:

cmd /C hg sum
cmd /C hg stat

可能是因为他只提到了.bat/.cmd文件。如果我没记错,call命令只能在这些文件上运行,但Cmd-C可以在其他文件上使用。 - mafu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接