Visual Studio:多个post-build命令?

时间:2010-01-02 19:20:33

标签: c# visual-studio-2008

Visual Studio 2008允许我声明一个命令并将其附加到项目的post-build事件中。像许多开发人员一样,我经常使用xcopy文件到应用程序输出目录。

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

这是正确的,还是有一种更简单的方法可以从构建后事件中调用两个命令?在此先感谢您的帮助。

11 个答案:

答案 0 :(得分:113)

您可以根据需要键入任意数量的后期构建命令。只需用换行符分隔它们。

以下是我的一个项目的例子。

Post Build Event Commandline

答案 1 :(得分:97)

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

e.g:

call MyBatch1.bat
call MyBatch2.bat

答案 2 :(得分:13)

还有另一种选择:您可以将命令与&&分开。 例如。

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

这与使用换行符分隔不完全相同:使用&&,如果上一个命令失败,则下一个commant将不会运行。

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

答案 3 :(得分:11)

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

答案 4 :(得分:7)

用&分隔命令或者&&要么 ;在VS2017中不起作用。无法相信这种简单的功能在VS2017中不可用。 Visual Studio尝试将后构建事件窗口中的整个文本作为一个字符串执行。我现在唯一的选择就是创建一个我不太喜欢的批处理脚本。

答案 5 :(得分:5)

添加到wompanswer

如果您在同一个构建事件中有多个属性表,可以执行以下操作来链接命令:

%(Command)
echo foo

其中%(Command)扩展为命令的先前值。

我个人为所有构建事件执行此操作,即使我目前没有继承命令,因为这可确保以后添加属性表时不会出现问题。

答案 6 :(得分:3)

在Visual Studio 2017中,您可以执行以下操作:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

答案 7 :(得分:1)

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

Image

上面的示例使用了“AfterResolveReferences”事件,但显然也适用于PostBuild事件。

答案 8 :(得分:1)

这个问题没有一个好的解决方案。调用的想法确实会导致其他脚本运行。我注意到错误检测不起作用。 把&#39;退出/ b 1&#39;进入FailMe.cmd 使用&#39;调用FailMe.cmd&#39;在后期构建步骤中。 注意构建不会失败?我正在使用VS 2017构建一个C#项目。 现在尝试使用&#39; FailMe.cmd&#39;构建现在报告错误。

如果错误报告很重要,那么您最好只使用一个脚本。

答案 9 :(得分:0)

给像我这样的白痴一个注意 - 有这个“下拉”按钮,所以你可以将命令编辑为多行文本 enter image description here

答案 10 :(得分:-4)

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

call Script1.cmd
call Script2.bat