Delphi 2007中是否可以调用多个后构建事件?

3

我正在尝试从Delphi 2007项目的后期构建事件中运行两个cmd文件。

构建事件的配置如下:

..\..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)
..\copydlls.cmd $(OUTPUTDIR)

第一个可以正常工作,第二个似乎从来没有被调用过。
如果我按照下面的顺序更改:
..\copydlls.cmd $(OUTPUTDIR)
..\..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)

再次强调,只有第一个被执行。

这是Delphi 2007的已知限制/错误吗?还是我在这里做错了什么? (我敢肯定过去这个功能是可以的。)

编辑:我找到了一个解决方法:

%comspec% /c ..\..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)
%comspec% /c ..\copydlls.cmd $(OUTPUTDIR)

这个按预期工作。仍然有点奇怪。

编辑2:在StackOverflow的这个答案中,我发现了另一个选项:

call ..\..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)
call ..\copydlls.cmd $(OUTPUTDIR)

我猜(没有尝试过)这只是一个问题,如果编译事件是cmd文件,而我之前提到的经验并没有调用cmd文件,而是可执行文件。
2个回答

3

我猜测我在EDIT2中添加的解决方法是应该使用的,因此我将其作为自己的答案添加:

当调用cmd文件(可能也适用于bat文件)时,必须在其前面添加“call”:

call ..\..\buildtools\postbuild.cmd $(OUTPUTDIR)$(OUTPUTNAME)
call ..\copydlls.cmd $(OUTPUTDIR)

1
您所面临的问题可以从文档中了解到call命令的内容。

Call(调用)

在不停止父批处理程序的情况下从另一个批处理程序调用一个批处理程序。

换句话说,如果在执行子程序时省略call,则当子程序返回时会停止父批处理程序。
因此,在构建操作中必须使用call来执行子程序。 更新 我第一次没有提到这一点,但上述内容隐含了构建操作是由命令解释器cmd.exe执行的。

这意味着构建事件被执行为批处理程序。这个有文档记录吗? - dummzeuch
我不确定它是否有记录。我知道这是真的,因为在进程资源管理器树视图中,我看到cmd.exe进程闪烁成为bds.exe的子进程。但我找不到说明文档。无论如何,你提出了一个很好的观点,在我的回答中我认为这是理所当然的。现在我已经纠正了这个问题。 - David Heffernan

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