Visual Studio:多个后期构建命令?

Visual Studio:多个后期构建命令?

问题描述:

Visual Studio 2008允许我声明一个命令并将其附加到项目的构建后事件。像许多开发人员一样,我经常使用它来将文件复制到应用程序输出目录。Visual Studio:多个后期构建命令?

我正在开发一个项目,我需要将文件从两个不同的地方复制到两个不同的目的地,所有这些都在一个项目中。换句话说,我需要从相同的构建后事件调用两个不同的xcopy命令。它看起来后生成事件只会采取一个单一的命令,如果我需要调用多个命令,我将不得不将这些命令放在一个* .bat文件中,并从生成后事件中调用它。

这是正确的,还是有更简单的方法来调用生成后事件中的两个命令?在此先感谢您的帮助。

您可以根据需要键入尽可能多的构建后命令。用换行符分开它们。

下面是我的一个项目的示例。

Post Build Event Commandline

+2

包含屏幕截图仅在您打算永久托管它时才有用。 – OWenJ23 2012-10-22 20:11:33

+1

@ OWenJ23 ...或'imageshack'在这种情况下;) – 2013-04-01 10:29:48

+11

尽管在单独的行中,我的命令一起运行,就好像它们在一行中一样。 – Trevor 2015-07-28 20:27:41

每个命令应该是在单独的行。但我发现,如果执行其中一个命令时出现错误,则整个后构建失败,因此您需要逐个尝试每个后构建命令进行调试。

+2

“xcopy/f”将显示完整的源文件和目标文件名,这些文件将在故障发生之前打印,使多个xcopy命令比多个复制命令更容易诊断。 – yoyo 2014-09-09 21:09:49

重要提示:执行批处理文件时,必须使用“call”语句,以便执行以下行。如果您不使用“呼叫”,执行进入.bat并且不会返回到以下行。与DOS提示符相同。

例如为:

call MyBatch1.bat 
call MyBatch2.bat 
+4

+1谢谢。这为我节省了一些我正在经历的悲痛。 – Bernard 2012-04-04 20:53:50

+0

谢谢!这正是我期待的! – 2012-07-06 12:44:28

+1

也是我的+1。完全忘了那个细节,并把我的头发拉出来。 – Greg 2013-04-18 16:25:30

还有另一种选择:你可以用&&分隔命令。 例如

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

这是不完全一样的用换行分隔:与&&,如果前面的命令失败,接下来commant将无法运行。

通过换行符分隔更容易阅读,所以您应该更喜欢它。不过,我知道至少有一种情况是&&有用。当你使用属性表在不同的机器上进行不同的构建后步骤时,情况就是这样。 VS 2008不允许直接在属性表中设置PostBuildStep,但是您可以使用您的命令添加一个用户宏并从主项目设置中调用它。宏是单行的,所以你可以使用&&在那里有多个命令。

只需在您的批处理脚本中加前缀“call”即可。因此,批处理脚本下面的语句也会在从批处理脚本返回调用后执行。

call Script1.cmd 
call Script2.bat 
+5

这个答案已经在2年前给出了。 – 2015-09-14 10:32:48

添加到wompanswer

如果你有一些多属性表上做相同的构建事件中,你可以做以下链的命令:

%(Command) 
echo foo 

其中%(Command)扩展到该命令的前一个值。

就我个人而言,我会为所有构建事件,即使我目前没有继承命令,因为这样可以确保在稍后添加属性表时不会出现问题。

+0

这也适用于自定义构建步骤。另外,在链的任何位置执行'exit'批处理语句会导致链中止。事实上'exit 1'会导致构建失败,而'exit 0'则会中止这个步骤并继续构建。 – 2015-06-03 17:06:29

womp建议的方法在Visual Studio 2015/2017(Windows)中可用,但在Visual Studio for Mac(预览版)中不起作用,它似乎只执行第一个命令。 ,我发现在Visual Studio中的Mac和Windows版本的工作,唯一的办法是链接2的MSBuild命令:

<Target Name="AfterResolveReferences"> 
<Exec Command="path\MyFirstCommand.exe -parameters" /> 
</Target> 
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" > 
<Exec Command="path\MySecondCommand.exe -parameters" /> 
</Target> 

上面的例子使用“AfterResolveReferences”事件,但显然应该PostBuild事件工作了。