Visual Studio:多个生成后命令?


101

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

我正在一个项目中,我需要将文件从两个不同的地方复制到两个不同的目的地,所有这些都在一个项目中。换句话说,我需要从同一构建后事件中调用两个不同的xcopy命令。看起来,构建后事件将仅接受单个命令,并且如果我需要调用多个命令,则必须将命令放入* .bat文件中,并从构建后事件中调用它。

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

Answers:


124

您可以输入任意数量的后期构建命令。只需用换行符将它们分开。

这是我的一个项目的示例。

生成后事件命令行


3
仅当您打算永久托管屏幕截图时,才有用。
Amandalishus

1
@ OWenJ23 ...或“ imageshack”;)
安东尼·沃尔什

27
尽管位于单独的行中,但我的命令却像在一行上一样一起运行。
特雷弗

6
不幸的是,如果其中一个中间命令失败,则至少VS2015似乎没有报告错误……它报告了后构建步骤的最后一条命令的结果。
Johannes S.

3
看来这可以在Visual Studio内部使用-但如果在TFS生成计算机上使用MsBuild,则不支持。MsBuild去除换行符,然后由于语法错误而使命令失败。
杰夫B

107

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

例如:

call MyBatch1.bat
call MyBatch2.bat

3
本技巧适用于grunt和npm命令,因为它们都在批处理文件(grunt.cmd和npm.cmd)中运行。
马特·瓦布洛

16

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

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

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

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


11

每个命令应放在单独的行上。但是我发现,如果执行这些命令之一出错,整个构建后都会失败,因此您需要一次尝试每个构建后命令进行调试。


2
“ xcopy / f”将显示完整的源文件名和目标文件名,这些文件名和文件名将在故障发生之前打印出来,从而使多个xcopy命令比多个copy命令更易于诊断。
yoyo 2014年

9

用&或&&或;分隔命令。在VS2017中不起作用。不能相信如此简单的功能在VS2017中不可用。Visual Studio尝试将生成后事件窗口中的整个文本作为一个字符串执行。现在对我来说唯一的选择是创建一个我不特别喜欢的批处理脚本。


1
在VS2017中,使用&&分隔命令对我有用。在VS2017编辑器中的单独一行上指定每个命令对我不起作用。
codeniffer

5

添加到womp答案

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

%(Command)
echo foo

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

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


1
这也适用于“定制构建步骤”。同样,exit在链中任何地方执行批处理语句都会导致链中止。确实exit 1会导致构建失败,而exit 0只是中止步骤并继续构建。
Martin Connell

3

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

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

1
我编辑了.csproj并在我的两个postbuild事件命令周围添加了<Command> </ Command>。那似乎没有用。当我在Visual Studio中查看“构建事件”时,它在两个命令周围都带有<Command> </ Command>,但是给出了一个构建错误:命令“ <Command xmlns =“ ..”> command1 command2 </ Command>”退出,代码为255。–
Jimmy,

1

womp建议的方法在Visual Studio 2015/2017(Windows)中有效,但在Visual Studio for Mac(Preview)中无效,后者似乎仅执行第一个命令。我发现在Mac和Windows版本的Visual Studio中都可以使用的唯一方法是链接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事件。


1

这个问题没有很好的解决方案。调用提示确实会导致其他脚本运行。我注意到错误检测将无法进行。将'exit / b 1'放入FailMe.cmd中在后期构建步骤中使用'call FailMe.cmd'。注意构建不会失败吗?我正在使用VS 2017构建C#项目。现在使用“ FailMe.cmd”进行尝试。现在,该版本报告错误。

因此,如果错误报告很重要,那么只使用一个脚本可能会更好。


-4

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

call Script1.cmd
call Script2.bat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.