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

112

Visual Studio 2008可以让我声明一个命令,并将其附加到项目的post-build事件上。像很多开发者一样,我经常使用它将文件复制到应用程序输出目录。

我正在处理一个需要从两个不同位置复制文件到两个不同目标的项目。换句话说,我需要从同一个post-build事件中调用两个不同的xcopy命令。看起来post-build事件只能接受单个命令,如果我需要调用多个命令,就必须将命令放在*.bat文件中,并从post-build事件调用该文件。

这是正确的吗?还是有更简单的方法可以从post-build事件调用两个命令?

14个回答

1

将遗留的.NET项目迁移到Visual Studio 2022。发现我无法运行多个Pre-Build或Post-Build命令。即使我正确使用了语法,切换Debug/Release时行为也不一致。我预计可能存在一个错误。

在Debug配置中,无论尝试什么,都会出现使用XCOPY /Y /F的错误。 错误代码2和4最常见,而Release则正常工作。我很难判断哪些是语法错误,哪些只是错误。XCOPY /Y /F在CMD / PowerShell中完美运行。

仅在“冒泡”命令(...)后才能执行多个命令(甚至包括条件语句)。

例如,从这个状态:

copy $(TargetDir)x64\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x64.dll
copy $(TargetDir)x86\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x86.dll
if $(ConfigurationName) == Release (
    call "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /t http://timestamp.sectigo.com /fd sha256 $(TargetPath)
)

(copy $(TargetDir)x64\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x64.dll)
(copy $(TargetDir)x86\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x86.dll)
(if $(ConfigurationName) == Release (
    call "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /t http://timestamp.sectigo.com /fd sha256 $(TargetPath)
))

额外的小提示,因为 ( ) 是特殊字符,如果你需要转义它们,请使用插入符号,即 ^)

Stackoverflow: 如果第一个文件不存在,则带有多个 if/copy 组合的后期构建事件仅执行


0
在Visual Studio 2022中,指定预构建和后构建事件的界面略有改变,但仍可以通过将每个命令放在自己的一行上来指定运行多个命令:

enter image description here

以上设置将以下内容添加到您的项目文件中:

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="echo Post 1&#xD;&#xA;echo Post 2" />
  </Target>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Pre 1&#xD;&#xA;echo Pre 2" />
  </Target>

编译后会生成类似于以下内容的东西:

1>------ Build started: Project: MyProject, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Pre 1
1>Pre 2
1>MyProject -> D:\repos\MyProject\bin\Debug\net6.0\MyProject.dll
1>Post 1
1>Post 2

0

-4
只需在您的批处理脚本前缀中添加"call ",这样在从批处理脚本返回调用后,批处理脚本下面的语句也将被执行。
call Script1.cmd
call Script2.bat

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